gcc 编译时对'xxxx'未定义的引用问题:在使用 gcc 编译的时候有时候会碰到这样的问题,编译为. o(obj) 文件没有问题,但是编译 (这一步应该是链接) 为可执行文件的时候会出现找不到'xxx'的定义的情况。
例如:
- g++ -o spider -rdynamic -lpthread -levent -lcrypt -ldl bloomfilter.o confparser.o crc32.o dso.o hashs.o md5.o qstring.o sha1.o socket.o spider.o threads.o url.o...dso.o:在函数'dso_load(char const*, char const*)'中:dso.cpp:(.text+0x3c):对'dlopen'未定义的引用dso.cpp:(.text+0x4c):对'dlsym'未定义的引用dso.cpp:(.text+0xb5):对'dlerror'未定义的引用dso.cpp:(.text+0x13e):对'dlclose'未定义的引用
原因
出现这种情况的原因,主要是 C/C++ 编译为 obj 文件的时候并不需要函数的具体实现,只要有函数的原型即可。但是在链接为可执行文件的时候就必须要具体的实现了。如果错误是未声明的引用,那就是找不到函数的原型,解决办法这里就不细致说了,通常是相关的头文件未包含。
解决办法
指定原因就好办了,既然知道是缺少了函数的具体实现,那么就给它这个函数的实现就好了。比如上面的例子,是因为缺失了 dlopen、dlsym、dlerror、dlclose 这些函数的实现,这几个函数是用于加载动态链接库的,编译的时候需要添加 - ldl 来使用 dl 库 (这是静态库,在系统目录下 / usr/lib/i386-linux-gnu/libdl.a、/usr/lib/x86_64-linux-gnu/libdl.a)。
但是看上面编译的时候是有添加 - ldl 选项的,那么为什么不行呢?
gcc 依赖顺序问题
这个主要的原因是 gcc 编译的时候,各个文件依赖顺序的问题。
在 gcc 编译的时候,如果文件 a 依赖于文件 b,那么编译的时候必须把 a 放前面,b 放后面。
例如: 在 main.c 中使用了 pthread 库相关函数,那么编译的时候必须是 main.c 在前,-lpthread 在后。gcc main.c -lpthread -o a.out。
上面出现问题的原因就是引入库的顺序在前面了,将其放置在后面即可了。
- g++ -o spider bloomfilter.o confparser.o crc32.o dso.o hashs.o md5.o qstring.o sha1.o socket.o spider.o threads.o url.o -rdynamic -lpthread -levent -lcrypt -ldl
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: http://www.92to.com/bangong/2017/04-12/20351334.html