设为首页 加入收藏

TOP

gcc 编译器对‘sqrt’未定义的引用与对‘pow’未定义的引用
2018-12-02 22:08:45 】 浏览:15
Tags:gcc 编译器 sqrt 定义 引用 pow

在使用gcc编译c时提示


/tmp/cchJksha.o:在函数‘prime’中:
linuxidc.c:(.text+0x11):对‘sqrt’未定义的引用
/tmp/cchJksha.o:在函数‘main’中:
linuxidc.c:(.text+0x9f):对‘pow’未定义的引用
collect2: error: ld returned 1 exit status


gcc编译的时候也要在指令后面加 -lm:


gcc 编译器对‘sqrt’未定义的引用与对‘pow’未定义的引用


即可编译成功。


原因:缺少某个库,用 -l 参数将库加入。Linux的库命名是一致的, 一般为 libxxx.so, 或 libxxx.a, libxxx.la, 要链接某个库就用  -lxxx,去掉头 lib 及 "." 后面的 so, la, a 等即可。


常见的库链接方法为:数学库 -lm; posix 线程 -lpthread


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



编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C语言谁在说谎问题代码及解析 下一篇常见加密算法简介

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(214) }