对lib所包含函数的未定义引用

时间:2019-07-12 10:34:02

标签: c dll linker undefined-reference

我有一个库,其中包含一个文件(在此处称为Util.c),并且我试图使用此文件中定义的一些功能来编译一些编。我已经在使用lib中的其他函数,但是该特定文件中的函数总是给我返回“未定义的引用”。真正奇怪的是:库中的其他函数确实使用了Util.c中的函数,并且运行良好。只是...我不能直接使用它们。

在这里,我将为您提供清晰的视图:

实用工具

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

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

实用程序:

#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"

MyFile.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相关的部分,则它看起来像这样:

库Makefile

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中的函数。但是它确实找到了标头,并且确实从lib中找到了其他函数,这些函数使用了Util.c的函数,所以我只是不明白它而已:'( 另外,我试图编译没有Util.c的lib,只是为了确保lib确实使用了它。然后,我得到了相同的“未定义引用”,因此似乎该库正确包含了Util.c

PS:我在32位Windows上,如果有什么用...

2 个答案:

答案 0 :(得分:0)

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

#include Util.c

引号丢失:

#include "Util.c"

通常,我们#.h而不是.c。

答案 1 :(得分:0)

即使我仍然无法理解问题,我也找到了使之起作用的方法。

似乎,在使用Mingw的Windows中,您必须在要从dll外部使用的每个函数的前面添加__declspec( dllexport )

因此,如果我这样更改Util.c:

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

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

我认为此lib是以某种方式设置的,因此具有“ publics”和“ private”功能;到现在为止,我只是使用公共的,而Util.c内部的是私有的。即使我不知道如何将函数设为私有或公开,这也是我看到的唯一解释。