转自:https://blog.csdn.net/killwho/article/details/53785910

引用:http://www.linuxdiyf.com/linux/16754.html

在使用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

Linux添加环境变量与GCC编译器添加INCLUDE与LIB环境变量:http://www.linuxdiyf.com/linux/16492.html

GCC编译器下的-L与-l的区别:http://www.linuxdiyf.com/linux/16182.html

Linux下GCC编译器用于编译运行的内核版本:http://www.linuxdiyf.com/linux/15874.html

Linux源码安装GCC编译器:http://www.linuxdiyf.com/linux/7348.html

最新文章

  1. 阿里云分布式关系数据库DRDS笔记
  2. 用css3制作旋转加载动画的几种方法
  3. OpenGL学习之路(一)
  4. ARM指令协处理器处理指令
  5. Wince6 RIL层移植
  6. 如何计算IP地址及CIDR,子网掩码计算
  7. IO与文件读写---使用Apache commons IO包提高读写效率
  8. DockerCon 2016
  9. 学习整理与细化(1)——Internet 的域名系统(domain name system)
  10. 11.vue 数据交互
  11. webserver
  12. oracle表分区创建
  13. mysql57免安装版配置
  14. piwik优化之定时任务生成统计数据
  15. springboot(三 使用mybatis +springboot 完成简单的增删改查)
  16. [日常] Go语言圣经--复数,布尔值,字符串习题
  17. 用开源项目RoundedImageView来实现 圆形 / 圆角 / 椭圆的图片
  18. jQuery插件开发之datalist
  19. PRINCE2考试用什么语言?
  20. Spring学习(五)——Spring注解(一)

热门文章

  1. 20145325张梓靖 《网络对抗技术》 PC平台逆向破解
  2. Arrays的排序算法sort及方法使用
  3. Cannot add foreign key constraint @ManyToMany @OneToMany
  4. 王之泰201771010131《面向对象程序设计(java)》第一周学习总结
  5. javbus爬虫-老司机你值得拥有
  6. sublime使用技巧总结
  7. C#获取文件MD5值方法
  8. P4313 文理分科
  9. HIHOcoder 1449 后缀自动机三·重复旋律6
  10. 题解——loj6279 数列分块入门3 (分块)