导航:首页 > 源码编译 > linux编译时出现错误

linux编译时出现错误

发布时间:2023-12-10 18:02:27

linux64位机器编译32位程序出现错误。

32 和 64 是完全两个不同的系统。Linux 他们的兼容,完全是基于内核的双模式切换功能,但是因为是基于内核的。所以 32 和 64 的系统函数库就还是没关系。
那么,你编译和运行 32 位程序,就需要 64 位的函数库接口支撑。同样 64 位程序,也需要 64 位的函数库提供支撑。

你这个问题,教程只让你装了最基本的编译器环境,但是函数支撑环境全都没有装,肯定是还会提示找不到需要的函数库的。
另外,就算你这个命令装了需要的函数库,也肯定只是装了 64 位的函数库,32 位库也没有装。那么编译 32 位程序也会出现找不到 32 位函数库的问题的。

你这个问题,我建议你学习两部分:
1、Linux 的依赖关系;
2、Linux 的 mutilib 相关实现。

我建议,编译 32 的程序请用纯 32 位系统。64 位系统只编译 64 位的程序。64 位系统只可以运行 32 位程序,不要用来编译。Linux 里面随便找个程序,就会依赖很多的函数库,这对于编译器调用来说,会很乱的。
如果真的没有空闲机器去单独跑 32 位系统了,我建议要么是 chroot 环境,要么是用交叉编译。不过注意这两种方式还是需要设置。

㈡ linux下编译IPK软件包出现错误,麻烦帮忙看一下是什么问题

1、configure,这一步一般用来生成Makefile,为下一步的编译做准备,你可以通过在configure后加上参数来对安装进行控制,比如代码:./configure--prefix=/usr上面的意思是将该软件安装在/usr下面,执行文件就会安装在/usr/bin(而不是默认的/usr/local/bin),资源文件就会安装在/usr/share(而不是默认的/usr/local/share)。同时一些软件的配置文件你可以通过指定--sys-config=参数进行设定。有一些软件还可以加上--with、--enable、--without、--disable等等参数对编译加以控制,你可以通过允许./configure--help察看详细的说明帮助。2、make,这一步就是编译,大多数的源代码包都经过这一步进行编译(当然有些perl或python编写的软件需要调用perl或python来进行编译)。如果在make过程中出现error,你就要记下错误代码(注意不仅仅是最后一行),然后你可以向开发者提交bugreport(一般在INSTALL里有提交地址),或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。3、makeinsatll,这条命令来进行安装(当然有些软件需要先运行makecheck或maketest来进行一些测试),这一步一般需要你有root权限(因为要向系统写入文件)。

㈢ Linux 0.11内核编译错误记录

现象1: 提示gas gld 比识别
措施: gnu编译器发展到后来,越来越流行,更多使用别名为 as ld gcc等.

现象2: 提示字节对齐需要是 2的倍数
措施: 具体解决方法: 利用命令 sed -i 's/align 2/align 4/g' filename 替换align 2 为 align 4(align 3 替换为 align 8)
sed -i 's/align 2/align 4/g' boot/head.s
sed -i 's/align 3/align 8/g' boot/head.s

现象3: -fcombine-regs -mstring-insns选项不识别
措施: 此两个选项已经过时,直接去掉即可

现象4: warning 特别多
措施: 将-Wall 替换为 -w

现象5: __stack_chk_fail 未定义
措施: 去网上搜了一下,在Makefile中的$(CFLAGS)后面加上-fno-stack-protector,即不需要栈保护

现象6: main.c 中_syscall0重复定义
措施: main.c static inline _syscall0(int, fork) 去掉static即可

现象7: 提示内嵌汇编不符合语法限制
措施: 类似的问题在后面编译中出现好多,C内嵌汇编的格式 asm (汇编语句:输入寄存器:输出寄存器:可能被修改的寄存器),最新的GCC规定 输入或输出寄存器不能出现在可能被修改的寄存器中,目前看到网上的方法是把所有类似问题的可能被修改的寄存器全部删掉 解决方案:find -type f -exec sed -i 's/:"w{2}"(,"w{2}") )/:) /g' {} ; 其中's/:"w{2}"(,"w{2}") /:/g'

现象8: 在 control.c 中清楚定义了 static unsigned char attr = 0x70 ,而在链接 control.o 时,却爆出 attr未定义。
措施: nm -C control.o 查看其符号,发现attr确实处于未定义状态。故单独编译一个小程序定义静态变量,查看其 .o 文件中,发现静态变量定义正常。故考虑为编译选项差异导致,最终发现因为 -O 编译优化选项导致,目前处理方式是去掉该选项。

现象9: build.c:(.text+0xde): undefined reference to `MAJOR'
措施: 通过分析编译打印信息,发现编译时没有加入头文件路径 -Iinclude

现象10: fs/fs.o: In function check_disk_change':(.text+0x1b2f): undefined reference to invalidate_buffers'
措施: 查找发现此函数定义在buffer.c 中,且为内联函数, 故尝试将其更改为普通函数, 然后编译通过.

现象11: 编译 build.c 时报错:/usr/include/i386-linux -gnu/bits/stdio2.h:57:8: error: unknown type name ‘__gnuc_va_list’
措施: 分析发现时此系列错误均由 -Iinclude 选项导致, 而该选项在 想象9 中加入, 故考虑去掉该选项, 直接在build.c 中加入 MAJOR 宏定义.

㈣ Linux编译link时提示undefined reference’dlclose’怎么办

在Linux系统下编译link时出现了错误,提示“undefined reference’dlclose@xxx函数”错误,相信不少用户也遇到这个问题,这个问题不难解决,下面小编给大家介绍下undefined reference错误的解决方法。

编译完link的时候,报了一句undefined reference’dlclose@xxx函数‘,找主程过来看了下,说是dl库没有包进去,查了下dl库是用来做动态库加载的(dynamic load),项目用到了libmysqld.so,加了之后还是有问题,将-ldl链接选项改到最后才可以。
比较常见的undefined reference问题:
1.dl库
undefined reference to ‘dlerror’
undefined reference to ‘dlopen’
undefined reference to ‘dlerror’
增加-ldl链接选项 (-l是链接选项的前缀)
2.pthread库
undefined reference to ‘pthread_create’
undefined reference to ‘pthread_xxxx‘
增加-lpthread链接选项
3.rt库
undefined reference to `clock_gettime’
增加-lrt链接选项
如果是使用codeblocks,可以再link option里加,不过因为依赖顺序的问题,如果link option里加了还是报错,直接在link file里添加pthread dl rt等即可
如果是你自己的库出现这undefined reference什么函数,先去查下库的源代码,看看具体问题。
上面就是Linux编译link出错的解决方法介绍了,本文除了介绍link出错外,还总结了一些undefined reference问题,希望对你有所帮助。

阅读全文

与linux编译时出现错误相关的资料

热点内容
不安全服务器是什么意思 浏览:519
挂载vhd命令 浏览:441
女主角是程序员男主角是医生 浏览:561
怎么解除app获取指纹 浏览:740
安卓仙剑修改器怎么用 浏览:537
松下服务器18代表什么 浏览:284
什么叫服务器高并发 浏览:958
单片机的pow函数 浏览:867
天气预报android界面 浏览:951
空调支持用户使用编程吗 浏览:683
亚马逊云服务器如何设置 浏览:736
java本地类 浏览:369
程序员话剧 浏览:778
通达信vix恐慌指数源码 浏览:25
火力app在哪里下载 浏览:101
linux查看安装的服务 浏览:176
tp277触摸屏编程软件 浏览:423
命令按钮能不能获得焦点 浏览:562
专属程序员的浏览器 浏览:723
cad图形界限命令 浏览:223