Chinaunix首页 | 论坛 | 博客
  • 博客访问: 830492
  • 博文数量: 137
  • 博客积分: 3477
  • 博客等级: 中校
  • 技术积分: 1409
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-30 21:53
文章分类

全部博文(137)

文章存档

2024年(8)

2023年(10)

2022年(4)

2021年(10)

2020年(9)

2018年(1)

2017年(1)

2014年(4)

2013年(3)

2012年(12)

2011年(24)

2010年(2)

2009年(8)

2008年(6)

2007年(34)

2006年(1)

分类: C/C++

2014-07-24 17:43:21

在 gcc 编译环境下的 32 位和 64位编译参数如下:

-m32         将目标文件编译成 32 位的可执行程序
-m64         将目标文件编译成 64 位的可执行程序


不知道从什么时候起, gcc 编译环境默认编译成 share 方式,即只能通过编译成动态链接可执行文件,不能编译成静态可执行文件,然而我们知道,由于程序发布方面的原因,如果在程序中使用了动态链接库,当最终发布环境没有需要动态调用的动态连接库(.so)的文件的时候,在生产环境的运行将报出错误,无法执行,这给我们的程序发布带来了很大的不便,因此有些时候,我们需要将最终的发布版本编译成静态可执行文件来规避上述问题。

然而,在 gcc 的 4.7 及以后的版本,默认状态下编译成静态可执行文件(带 -static 参数编译)时会抱错,错误信息如下:

/bin/ld: cannot find -lc
collect2: 错误:ld 返回 1

这其实是编译成静态可执行文件的时候,需要链接 libc.a 的文件,该文件默认并没有放到 /usr/lib ( 对于 64 位系统而言,对应目录为 /usr/lib64 ),从而使得在编译的时候找不到 libc.a 的静态链接库,从而造成编译失败。

解决的办法是找到 libc.a 文件,并在 /usr/lib 目录下建立软连接。

如:我的系统是 CentOS 7 64-bit 的系统,其 libc.a 的实际位置是 /usr/lib/x86_64-redhat-linux6E/lib64/libc.a
我在 /usr/lib64 下建立 libc.a 的软连接
# cd /usr/lib64
# ln -sf /usr/lib/x86_64-redhat-linux6E/lib64/libc.a libc.a

再次编译成静态可执行文件,就不会报出编译错误的问题了。



阅读(4496) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~