交叉编译时提示 对'__C_ctype_b'的未定义引用

作者&投稿:竺宁 (若有异议请与网页底部的电邮联系)
linux C G++提示对XXXX未定义的引用~

动态库的问题,编译的时候要把使用的库包含上。具体的还请询问百度。

编译的时候需要连接相应的库,加个 -lm 参数就可以

出现这种情况的原因,主要是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


灌南县15299537266: 交叉编译几种常见的报错 -
壬翰美乐: 交叉编译器是一种可以在平台A上为另一种平台B编译程序的编译器.其中,运行交叉编译器的平台A称为宿主机,交叉编译生成的目标文件的运行平台B称为目标机.交叉编译器的编译过程称为交叉编译.一个完整的arm-linux交叉编译器包括...

灌南县15299537266: 以下关于#import和#include以及@class的说法错误的是 -
壬翰美乐: #import和#include的区别是#import处理了重复引用的问题,而@class则是用来做类引用的,交叉编译的时候要用@class,具体解释如下: #include 在使用#include的时候要注意处理重复引用(这也是oc中#include与#import的区别) 例如:...

灌南县15299537266: 在WINDOWS下交叉编译LINUX程序运行不了是为什么 -
壬翰美乐: 交叉编译出来的文件在目标机上无法运行大多由两个原因造成:1 交叉编译工具链与目标机架构不匹配,也就是选错了编译工具;2 缺少依赖库,这种情况可使用ldd命令查看依赖项,检查一下是否缺少依赖库文件

灌南县15299537266: 安装完交叉编译器后输入arm - linux - gcc命令出现arm - none - linux - gnueabi: no input files是怎么回事 -
壬翰美乐: 交叉编译器是用来编译arm处理器对应的linux代码或者驱动代码的. 你输入arm-linux-gcc实际上是要求进行编译操作 编译操作需要找到makefile文件. 你只输入了arm-linux-gcc,就说明没有指定编译路径,所以在当前目录下查找makefile. 如果当前路径下没有makefile,就会提示arm-none-linux-gnueabi: no input files. 建议到网上找找交叉编译器使用方法的文章,了解一下再继续使用.

灌南县15299537266: C语言中'#"作用 -
壬翰美乐: 头文件前使用#,表示预处理,加入到工程中一并编译. 其他用法: 在printf中的%后面的那个#是用来格式说明的, 如果在g,G,f,e或者E代码前加一个#,可以确保显示一个小数点(即使没有小数位), 在o之前加上则输出八进制, 在p,x或者X之...

灌南县15299537266: 交叉编译 GCC 出错了 找不出问题! -
壬翰美乐: CFLAGS = -I/usr/local/include -Wall -Wstrict- 改成 CFLAGS = -I/usr/local/include -L/usr/local/lib -Wall -Wstrict- 试试 如果不行,你看看你的minigui的库是否存在

灌南县15299537266: 用ADS1.2编程出现错误Error : L6239E: Cannot call ARM symbol 'Main' in non - interworking........ -
壬翰美乐: ADS可以由用户设置把用户程序编译为ARM还是THUMB指令,或者是既有THUMB又由ARM指令(交叉编译).但在不选择交叉编译的情况下,不能相互调用.根据错误提示分析,你的工程设置中,C语言文件设置编译为THUMB指令,而汇编文件设置为了ARM指令 (可以分开指定).而你又没有选择交叉编译(interworking),这就导致编译通不过.你在设置里重新设置一次,把所有文件都编译为ARM,保证编译通过.

灌南县15299537266: 求助:mplayer交叉编译时遇到的错误 -
壬翰美乐: 交叉编译mplayer的时候出现这样的错误arm1176jzf-s+vfp_gcc-4.8-linaro_uClibc-0.9.33.2_eabi/include/stdio.h:36, from mplayer.c:5: ./libavutil/bswap.h:42:34: error: expected identifier or '(' before '__extension__' static av_always_inline uint16_t ...

灌南县15299537266: 在Turbo C中调试程序时出现unable to open input file 'xxxx'怎么办 -
壬翰美乐: 我先说明一下C语言的安装和使用中最应该注意的地方:许 多网友在下载Turbo C 2.0和Turbo C++ 3.0后,向我问得最多的是在使用过程中 碰到如下问题: 1)出现找不到 stdio.h conio.h等include文件; 2)出现cos.obj无法连接之类的错误 这些...

灌南县15299537266: 一个C语言工程在linux下用gcc编译可以通过,但用arm - linux - gcc交叉编译会报错.
壬翰美乐: 这个很正常,交叉编译的头文件和标准的不一样,定义的时候缺少一些宏或者函数,根据情况稍微修改一般可以的.除非是操作系统不一样否则一般都可以很快改正.举一个不容易改正的例子,MingW是一种Windows下的GCC移植版本,但是它没有fork,所以如果程序中存在fork就会报错,但是这个错误很难修正,因为Windows里面没有fork函数.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网