试图包含一个库,但不断收到'未定义的引用'的消息

我正在尝试使用libtommath库。 我在Ubuntu linux上为我的项目使用了NetBeans IDE。 我已经下载并构build了库,我已经做了一个“make install”,将生成的.a文件放入/ usr / lib /和.h文件到/ usr / include

这似乎是find适当的文件(因为我不再得到这些错误,我安装到/ usr目录之前)。

但是,当我创build一个简单的主调用mp_init(在库中),当我尝试使我的项目时,我得到以下错误:

mkdir -p build/Debug/GNU-Linux-x86 rm -f build/Debug/GNU-Linux-x86/main.od gcc -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/main.od -o build/Debug/GNU-Linux-x86/main.o main.c mkdir -p dist/Debug/GNU-Linux-x86 gcc -o dist/Debug/GNU-Linux-x86/cproj1 build/Debug/GNU-Linux-x86/main.o build/Debug/GNU-Linux-x86/main.o: In function 'main': /home/[[myusername]]/NetBeansProjects/CProj1/main.c:18: undefined reference to `mp_init' collect2: ld returned 1 exit status make[2]: *** [dist/Debug/GNU-Linux-x86/cproj1] Error 1 

所以,看起来链接器不能在库中find函数,但它在那里,所以我只是不知道是什么原因造成的。 任何帮助,将不胜感激。

如果我直接inputgcc命令并跳过makefile,我也得到相同的错误,我也确保静态库也使用gcc编译。

编辑添加:

我得到这些相同的错误,如果我直接编译并添加库与-l或-L:

 $ gcc -l /usr/lib/libtommath.a main.c /usr/bin/ld: cannot find -l/usr/lib/libtommath.a collect2: ld returned 1 exit status $ gcc -llibtommath.a main.c /usr/bin/ld: cannot find -llibtommath.a collect2: ld returned 1 exit status $ gcc -Llibtommath.a main.c /tmp/ccOxzclw.o: In function `main': main.c:(.text+0x18): undefined reference to `mp_init' collect2: ld returned 1 exit status $ gcc -Llibtommath.a main.c /tmp/ccOxzclw.o: In function `main': main.c:(.text+0x18): undefined reference to `mp_init' collect2: ld returned 1 exit status 

我对这个东西非常生疏,所以我不确定我在这里使用正确的命令,在-L例子中是find的库? 如果图书馆没有被发现,我怎样才能find图书馆? 它在/ usr / lib中,我用当前目录下的.a文件试过了。有没有需要设置的环境variables? 如果是这样,如何,等等

非常感谢帮忙。

我已经尝试了一个完全不同的库(GMP),并具有相同的问题。 这已经成为某种Ubuntu环境问题了? 任何人有任何想法如何解决这个问题?

这里的诀窍是在你正在编译的模块之后放置库。 问题是一个参考的东西。 链接器按顺序parsing引用,所以当库被编译之前,链接器会感到困惑,并不认为库中的任何函数都是需要的。 通过在模块之后放置库,模块中对库的引用由链接器parsing。

是的,需要在源文件/对象文件之后添加库。 这个命令将解决这个问题:

 gcc -static -L/usr/lib -I/usr/lib main.c -ltommath 

如果.c源文件被转换成.cpp文件(就像在parsec中一样),那么外部文件需要跟着“C”

 extern "C" void foo();