首页 > 解决方案 > 对库中包含的函数的未定义引用

问题描述

我有一个包含一个文件的库(此处称为 Util.c),我正在尝试使用该文件中定义的一些函数来编译一个小程序。我已经在使用 lib 中的其他函数,但是这个特定文件的函数总是给我一个“未定义的引用”。真正奇怪的是:lib 中的其他函数确实使用了 Util.c 中的函数,而且效果很好。只是……我不能直接使用它们。

我将尝试让您清楚地了解这里的情况:

实用程序

void foo (void *var){
    print ("in Foo!");
}

void *bar (int var){
    print ("in bar!");
}

实用程序.h:

#ifndef UTIL_DEFINED
#define UTIL_DEFINED

void foo(void *var)
void *bar(int var)

#endif

libobj.c:

#include "Util.c"
// #include "a lot of other files.c"

我的文件.c:

#include "Util.h"
// #include "others headers from the lib which functions are working well"

int main(){
//here i use the lib's function without a prob, except for the ones coming from Util.c, namely foo and bar. For example: 

int *var;
//Say that LibFunc is another function from the lib, but not from Util.c. 
//Libfunc make a call to foo, and it's working well. 
Libfunc(var);

//However, here i try to use foo or bar, and i get the undefined reference!
foo(var);

bar(var);

}

Makefile 是一件大事,但如果我只搜索与 lib 相关的部分,它看起来像这样:

库生成文件

default: $(LIB)
$(LIB): $(LIBOBJ)
    -$(RM) "$@"
    $(DLLD) -o "$@" $(DLLDFLAGS) "$(LIBOBJ)"
$(LIBOBJ): libobj.c $(LIBSRC) $(LIBINC)
    $(CC) -c $(LOTOFFLAGS) libobj.c -o "$@"

LIBSRC: libobj.c\
    aBunchOfOtherFiles.c
LIBINC: Util.h\ 
    ABunchOfHeadersFiles.h 

LIBOBJ=$(LIBNAME)dll.o
LIB=$(LIBNAME).dll


CC= gcc
DLLD = gcc -shared -fprofile-arcs -ftest-coverage -fprofile-generate
DLLDFLAGS = -fPIC
LOTOFFLAGS = -Wall -pedantic -Wno-long-long -Wno-unused-function -g -g3 -ggdb -std=c99 --coverage -fprofile-arcs -ftests-coverage -fprofile-generate -Wl,--allow-multiple-definition -fPIC $(IFLAGS)
#IFLAGS include all headers files, as well as some info concerning Lib version, OS, PROC, etc... not so important here. 
IFLAGS = -I$(FOLDERS) -DWINDOWS
FOLDERS= MyFolders
LIBNAME = MyLibName

RM= del

最后,我的 makefile 看起来像这样:

我的 Makefile

default: $(PROG_EXE)

$(PROG_EXE) : $(LIB) $(PROG_OBJ) 
    $(CC) $(SOMEFLAGS) $(PROG_OBJ) "$(LIB)" -o "$@"
$(PROG_OBJ) : MyFile.c $(LIBINC)
    $(CC) -c $(SOMEFLAGS) -$(IFLAGS) MyFile.c -o "$@"

LIB = $(LIBNAME).dll
LIBINC = Util.h\
    ABunchOfHeadersFiles.h 

PROG_EXE= MyProg
PROG_OBJ = MyProg.o

CC= gcc
SOMFLAGS = -Wall -std=c99 -pedantic -g -g3 - ggb -fprofile-arcs -ftests-coverage 
#IFLAGS basically include all folders containing source code and headers. Also gives some D, such as OS, PROC or the lib version. Not really important for my prob. 
IFLAGS = -I$(FOLDERS) -DWINDOWS 
FOLDERS = MyFolders
LIBNAME = MyLibName

请注意,我没有做任何事情。我只是应该让它工作......

我试图得到所有的标志(认为我得到了所有的标志)。其中一些仅用于 gcov,其他仅用于包含好的文件夹和文件。我已经检查过: Util.c 和 Util.h 已正确包含在这些文件中。顺便说一句,当我编译 MyProg 时,我在 Util.h 上没有“找不到文件”错误,所以它被发现了。

另外,我已经看到 foo 应该得到一个 void* 并且实际上被赋予了一个 int*。但我不认为这是这里的问题,因为当我直接使用 Util.c 编译 MyProg 时,没有尝试从 lib 中获取它,它运行良好。

所以我真的认为,不知何故,我的编无法在库中找到函数。但是它确实很好地找到了头文件,并且确实很好地找到了 lib 中的其他函数,并且这些函数使用了 Util.c 中的函数,所以我就是不明白:'( 另外,我试图编译没有 Util.c 的库,只是为了确保该库真正使用它。然后我得到了相同的“未定义引用”,所以似乎该库正确包含 Util.c

PS:我在Windows 32位上,如果有任何用处...

标签: cdlllinkerundefined-reference

解决方案


我认为错误来自 libobj.c 文件:

#include Util.c

引号不见了:

#include "Util.c"

一般来说,我们#include .h 而不是 .c。


推荐阅读