尝试包括图书馆,但不断收到“未定义参考”消息 [英] Trying to include a library, but keep getting 'undefined reference to' messages

查看:233
本文介绍了尝试包括图书馆,但不断收到“未定义参考”消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图使用libtommath库。我使用NetBeans IDE以我在Ubuntu Linux项目。我已经下载并建库,我做了'make install'来把生成的某文件到/ usr / lib目录/和.h文件到/ usr / include目录

I am attempting to use the libtommath library. I'm using the NetBeans IDE for my project on Ubuntu linux. I have downloaded and built the library, I have done a 'make install' to put the resulting .a file into /usr/lib/ and the .h files into /usr/include

这似乎是适当寻找文件(因为我无法再获得这些错误,我安装到/ usr目录之前所做的那样)。

It appears to be finding the files appropriately (since I no longer get those errors, which I did before installing into the /usr directories).

然而,当我创建一个简单的主制作到mp_init调用(这是在库),我得到以下错误,当我试图让我的项目:

However, when I create a simple main making a call to mp_init (which is in the library), I get the following error when I attempt to make my project:

mkdir -p build/Debug/GNU-Linux-x86
rm -f build/Debug/GNU-Linux-x86/main.o.d
gcc -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -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

所以,它看起来像连接器找不到库中的函数,但它是存在的,所以我只是不知道这可能是导致此。任何帮助将是AP preciated。

So, it looks like the linker can't find the function within the library, however it IS there, so I just don't know what could be causing this. Any help would be appreciated.

我得到同样的错误,如果我直接键入gcc的命令,并跳过的makefile,我也确信静态库得到了使用GCC编译为好。

I get the same error if I type the gcc command directly and skip the makefile, I also made sure the static library got compiled with gcc as well.

编辑补充:

如果我直接做编译和-l或-L添加库我得到这些同样的错误:

I get these same errors if I do the compile directly and add the library with -l or -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实例库被发现?如果库没有被发现,如何在地球上我得到它找到库?它在/ usr / lib中,我已经在当前目录中的某文件试了一下,等是否有一个环境变量,我需要设置?如果是这样,怎么样,等等。

I am very rusty on this stuff, so I'm not sure I'm using the right command here, in the -L examples are the libraries being found? If the library isn't being found how on earth do I get it to find the library? It's in /usr/lib, I've tried it with the .a file in the current directory, etc. Is there an environment variable I need to set? If so, how, etc.

感谢这么多的帮助。

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

I've tried a completely different library (GMP) and had the EXACT same problem. This has got to be some kind of Ubuntu environment issue? Anyone have any idea how to fix this?

推荐答案

这里的窍门是把图书馆您正在编译模块后。问题是一个参考的东西。链接器解析,以便引用,所以当库前的模块被编译,链接器会很困惑,不认为任何在图书馆的功能是必要的。通过将库中的模块后,在模块中图书馆中的引用链接器解析。

The trick here is to put the library AFTER the module you are compiling. The problem is a reference thing. The linker resolves references in order, so when the library is BEFORE the module being compiled, the linker gets confused and does not think that any of the functions in the library are needed. By putting the library AFTER the module, the references to the library in the module are resolved by the linker.

这篇关于尝试包括图书馆,但不断收到“未定义参考”消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆