我有一个库,其中包含一个文件(在此处称为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上,如果有什么用...
答案 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内部的是私有的。即使我不知道如何将函数设为私有或公开,这也是我看到的唯一解释。