gcc编译时对'xxxx'未定义的引用问题
2015-07-30 10:21
411 查看
gcc编译时对’xxxx’未定义的引用问题
gcc编译时对’xxxx’未定义的引用问题原因
解决办法
gcc 依赖顺序问题
在使用
gcc编译的时候有时候会碰到这样的问题,编译为
.o(obj) 文件没有问题,但是编译(这一步应该是链接)为可执行文件的时候会出现找不到’xxx’的定义的情况。
本文由乌合之众 lym瞎编,欢迎转载
blog.cnblogs.net/oloroso
本文由乌合之众 lym瞎编,欢迎转载
my.oschina.net/oloroso
例如:
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
相关文章推荐
- mongodb max,distinct操作
- 如何在Linux下使用Markdown进行文档工作
- 用一个二维码做下载地址,自动区分是 ios 还是 android
- ASYNC PROGRAMING IN JAVASCRIPT
- ios打印日志的类,方法,及行号
- iOS8 本地通知基本用法
- ASYNC PROGRAMING IN JAVASCRIPT[转]
- DIV周边添加投影及背景固定
- 【转】Atmega32串口驱动(基于ucos)——循环缓冲区
- WPF绑定Binding及模式
- ubuntu使用记录-----安装yum工具
- 反编译APK
- android 图片自动滚动
- FreeBSD Kqueue的实现原理
- 2015多校联赛第三场(部分题解)
- Java SPI机制
- Android初学-----px2dp,dp2px
- Python Jython 记录 ImportError
- iOS文字排版(CoreText)
- HDU-4055 Number String