gcc编译时对’xxxx’未定义的引用问题
来源:互联网 发布:为什么谭咏麟你知我知 编辑:程序博客网 时间:2024/06/13 08:08
在使用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
0 0
- gcc编译时对'xxxx'未定义的引用问题
- gcc编译时对'xxxx'未定义的引用问题
- ubuntu gcc编译时对’xxxx’未定义的引用问题
- gcc编译时对’xxxx’未定义的引用问题
- gcc/g++编译时对'xxxx'未定义的引用问题
- g++编译时对'xxxx'未定义的引用问题(undefined reference to)
- [编译环境][gcc]对‘_GLOBAL_OFFSET_TABLE_’未定义的引用
- gcc 编译器对 sqrt 未定义的引用
- gcc 编译器对 sqrt 未定义的引用
- gcc 编译器对 sqrt 未定义的引用
- gcc 对‘sqrt’未定义的引用
- Linux编译问题:对‘pthread_create’未定义的引用
- 关于链接失败 对xxxx ‘__gxx_personality_v0’未定义的引用
- 【GCC调试程序C语言问题】对‘ceil’未定义的引用/已经包含头文件仍然提示未定义的引用
- Eclipse CDT gcc 报错 对‘exp’未定义的引用
- 编译Linux程序出现“对‘pthread_create’未定义的引用”
- Linux编译错误:对‘sem_wait’未定义的引用
- c++使用thread类时编译出错,对‘pthread_create’未定义的引用
- 数据库基础知识_2
- Qt 连接MySQL 驱动问题
- 类序列化问题-java.io.InvalidClassException
- 1015. Reversible Primes (20)
- 仿微信设置字体大小控件
- gcc编译时对’xxxx’未定义的引用问题
- ios学习第五天(三)View常用操作
- 三步学会Java Socket编程
- 线性代数笔记-1-方程组的几何解释
- MYSQL错误TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE的解决方案
- 要求输出从1到1000范围内所有与7相关数字的个数,与7相关的数字定义为,是7的倍数或者数字中含有7,比如17和71均含有‘7’。
- map,multimap,set,multiset
- 18-TCP 协议(迟到的 ACK—— Linux)
- POJ