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

栏目: 服务器 · 编程工具 · 发布时间: 6年前

内容简介:linuxidc@linuxidc:~/linuxidc.com$ gcc linuxidc.c -o linuxidc.com在使用gcc编译c时提示/tmp/cchJksha.o:在函数‘prime’中:

linuxidc@linuxidc:~/linuxidc.com$ gcc linuxidc.c -o linuxidc.com

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

linuxidc@linuxidc:~/linuxidc.com$ gcc linuxidc.c -o linuxidc.com -lm

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

即可编译成功。

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

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

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

在使用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公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2018-11/155614.htm


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Uberland

Uberland

Alex Rosenblat / University of California Press / 2018-11-19 / GBP 21.00

Silicon Valley technology is transforming the way we work, and Uber is leading the charge. An American startup that promised to deliver entrepreneurship for the masses through its technology, Uber ins......一起来看看 《Uberland》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具