gcc编译时对’xxxx’未定义的引用问题

在使用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文件的时候并不需要函数的具体实现,只要有函数的原型即可。但是在链接为可执行文件的时候就必须要具体的实现了。如果错误是未声明的引用,那就是找不到函数的原型,解决办法这里就不细致说了,通常是相关的头文件未包含。

解决办法

指定原因就好办了,既然知道是缺少了函数的具体实现,那么就给它这个函数的实现就好了。比如上面的例子,是因为缺失了dlopendlsymdlerrordlclose这些函数的实现,这几个函数是用于加载动态链接库的,编译的时候需要添加-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

原文地址:https://www.cnblogs.com/qiumingcheng/p/8366159.html

时间: 2024-10-14 04:35:59

gcc编译时对’xxxx’未定义的引用问题的相关文章

gcc编译时对'xxxx'未定义的引用问题

gcc编译时对’xxxx’未定义的引用问题 gcc编译时对’xxxx’未定义的引用问题 原因 解决办法 gcc 依赖顺序问题 在使用gcc编译的时候有时候会碰到这样的问题,编译为.o(obj) 文件没有问题,但是编译(这一步应该是链接)为可执行文件的时候会出现找不到’xxx’的定义的情况. 本文由乌合之众 lym瞎编,欢迎转载blog.cnblogs.net/oloroso 本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso 例如: g++ -o spider -

gcc/g++ 编译时出现:“对’xxxx’未定义的引用,collect2: error: ld returned 1 exit status” 的错误

出现的问题: 在使用 make 编译实现一个程序时,出现了下面的错误.查看程序源文件所在的目录时发现程序已经完成了编译,并生成了 list_repo.o 的文件,说明是在程序链接生成可执行文件时发生了问题. storages/local.o:在函数‘LocalStorage::init(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >,

gcc g++编译时警告:&quot;xxxx&quot; 将随后被初始化_解决方法

gcc g++编译时警告:  "xxxx" 将随后被初始化: 这个问题的原因是在构造函数里,如果你在构造函数中初始化变量时,用的是初始化列表的方式,则初始化列表中的成员变量初始化顺序要和类定义时的变量顺序一致.

Ubuntu gcc错误:对&#39;log&#39;等函数未定义的引用

a.c 1 #include <stdio.h> 2 #include <math.h> 3 int main() 4 { 5 float a; 6 void print_logarithm(double); 7 printf("enter a num:"); 8 scanf("%f",&a); 9 print_logarithm(a); 10 return 0; 11 } 12 void print_logarithm(double

编译压缩代码 MFCompress-src-1.01 :对‘***’未定义的引用

提示 MFCompressD.o:在函数'main'中:MFCompressD.c:(.text.startup+0x34a): 警告: the use of `tempnam' is dangerous, better use `mkstemp'MFCompressD.o:在函数'DecodeSeqBlock'中:MFCompressD.c:(.text+0x149):对'GetInfoPModelIdx'未定义的引用MFCompressD.c:(.text+0x20c):对'GetPMode

编译lua5.3.2报错提示libreadline.so存在未定义的引用解决方法

从官网上下载5.3.2的源码后,make linux进行编译,提示报错: gcc -std=gnu99 -o lua lua.o liblua.a -lm -Wl,-E -ldl -lreadline /usr/local/lib/libreadline.so:对‘tputs’未定义的引用 /usr/local/lib/libreadline.so:对‘tgoto’未定义的引用 /usr/local/lib/libreadline.so:对‘tgetflag’未定义的引用 /usr/local/

关于链接失败 对xxxx ‘__gxx_personality_v0’未定义的引用

用惯了gcc编译程序,结果今天重构一个c程序为c++,编译,链接报了个错: /tmp/ccrDo3QI.o:(.eh_frame+0x2af):对'__gxx_personality_v0'未定义的引用 代码里面真看不出来啊,好纠结.. 最后发现,是因为C++要用g++而不是gcc编译链接啊,尼玛... 一般c++用gcc编译没事,但是链接可能会出问题.

由于未定义的引用,无法获取OpenCV进行编译?

错误提示: CMakeFiles/my_subscriber.dir/src/my_subscriber.cpp.o:在函数‘imageCallback(boost::shared_ptr<sensor_msgs::Image_<std::allocator<void> > const> const&)’中:my_subscriber.cpp:(.text+0xb0):对‘cv::imshow(cv::String const&, cv::_InputA

error:: undefined reference to symbol &#39;__glewBufferSubData&#39; 未定义的引用 以及 error: main.o: undefined reference to symbol &#39;glTexImage2D&#39;

在把DSO移植到QT工程中,出现了 p,li { white-space: pre-wrap } /usr/bin/ld: KeyFrameDisplay.o: undefined reference to symbol '__glewBufferSubData' 报错,原因是.pro文件中没有加 GLEW库. 解决方案: 在.pro文件中加上这句: p,li { white-space: pre-wrap } ##### GLEW ##### LIBS += -lGLEW error: mai