Linux和FreeBSD在使用非系统自带的gcc时的区别
2014-06-16 14:20
351 查看
下面拿CentOS 5和FreeBSD 9.0做下比较:
CentOS 5 自带的gcc是gcc (GCC) 4.1.2,通过yum可以安装gcc44 (GCC) 4.4.4
FreeBSD 9.0 自带的gcc是gcc (GCC) 4.2.1,通过ports可以安装gcc 4.6 (目前是4.6.2)
我们用C++写一个非常简单的C++程序:
int main(){
return 0;
}
然后用g++编译:
# g++44 main.cpp -o main
然后用ldd查看,Linux下的输出结果为:
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x000000336f000000)
libm.so.6 => /lib64/libm.so.6 (0x000000336cc00000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x000000336e400000)
libc.so.6 => /lib64/libc.so.6 (0x000000336c400000)
/lib64/ld-linux-x86-64.so.2 (0x000000336c000000)
FreeBSD下的输出结果为:
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0×800849000)
libm.so.5 => /lib/libm.so.5 (0x800b59000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x800d7a000)
libc.so.7 => /lib/libc.so.7 (0x800f87000)
其中有两行我故意标红了。因为他们是来自于gcc。那么就有这么一个问题:不同版本的gcc,这两个库,一样吗?或者我这么问,gcc 4.4、gcc 4.6、gcc 4.2、gcc 4.1相比,他们的C++标准库(libstdc++.so)的接口一样吗? 实现一样吗?(此处指需要被编译的那部分,如非模板类)
我们来看看CentOS怎么做的:
CentOS 5的gcc44-c++这个包,只带了两个so。/usr/lib/gcc/x86_64-redhat-linux6E/4.4.4/32/libstdc++.so和/usr/lib/gcc/x86_64-redhat-linux6E/4.4.4/libstdc++.so。而这两个so竟然只是文本文件,内容大概是这样:
INPUT ( -lstdc++_nonshared /usr/lib64/libstdc++.so.6 )
也就是说,它会静态链接到/usr/lib/gcc/x86_64-redhat-linux6E/4.4.4/libstdc++_nonshared.a这个文件,并动态链接到/usr/lib64/libstdc++.so.6(这个文件由gcc 4.1提供)
所以,在CentOS 5中,用gcc 4.4编译出来的东西,运行环境不需要安装gcc 4.4 !
然后看FreeBSD怎么做的:
gcc 4.6的so,安装在/usr/local/lib/gcc46/目录下。如果你是在64位环境下安装的,那么只有64位版本的,没有32位版本的。最关键的是,它确实是一个elf格式的so,而不是文本文件、软链接什么的。
如果在FreeBSD下这么编译一个文件:
# g++46 -o t test.cpp
那么它会错误的链接到4.2的so上
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0×800849000)
libm.so.5 => /lib/libm.so.5 (0x800b59000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x800d7a000)
libc.so.7 => /lib/libc.so.7 (0x800f87000)
你的程序还能不能正常工作,那就看天命了。正确的做法是,在链接的时候加上-Wl,-rpath=/usr/local/lib/gcc46 。
FreeBSD的官网上有一个文档解释了这个问题:http://www.freebsd.org/doc/en/articles/custom-gcc/article.html但是这个文档有点老,而且写的不是很详细。
现在如果只是为了让ports用gcc 4.6,那么直接在/etc/make.conf中加入“USE_GCC=4.6”即可
,
作者 snnn
CentOS 5 自带的gcc是gcc (GCC) 4.1.2,通过yum可以安装gcc44 (GCC) 4.4.4
FreeBSD 9.0 自带的gcc是gcc (GCC) 4.2.1,通过ports可以安装gcc 4.6 (目前是4.6.2)
我们用C++写一个非常简单的C++程序:
int main(){
return 0;
}
然后用g++编译:
# g++44 main.cpp -o main
然后用ldd查看,Linux下的输出结果为:
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x000000336f000000)
libm.so.6 => /lib64/libm.so.6 (0x000000336cc00000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x000000336e400000)
libc.so.6 => /lib64/libc.so.6 (0x000000336c400000)
/lib64/ld-linux-x86-64.so.2 (0x000000336c000000)
FreeBSD下的输出结果为:
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0×800849000)
libm.so.5 => /lib/libm.so.5 (0x800b59000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x800d7a000)
libc.so.7 => /lib/libc.so.7 (0x800f87000)
其中有两行我故意标红了。因为他们是来自于gcc。那么就有这么一个问题:不同版本的gcc,这两个库,一样吗?或者我这么问,gcc 4.4、gcc 4.6、gcc 4.2、gcc 4.1相比,他们的C++标准库(libstdc++.so)的接口一样吗? 实现一样吗?(此处指需要被编译的那部分,如非模板类)
我们来看看CentOS怎么做的:
CentOS 5的gcc44-c++这个包,只带了两个so。/usr/lib/gcc/x86_64-redhat-linux6E/4.4.4/32/libstdc++.so和/usr/lib/gcc/x86_64-redhat-linux6E/4.4.4/libstdc++.so。而这两个so竟然只是文本文件,内容大概是这样:
INPUT ( -lstdc++_nonshared /usr/lib64/libstdc++.so.6 )
也就是说,它会静态链接到/usr/lib/gcc/x86_64-redhat-linux6E/4.4.4/libstdc++_nonshared.a这个文件,并动态链接到/usr/lib64/libstdc++.so.6(这个文件由gcc 4.1提供)
所以,在CentOS 5中,用gcc 4.4编译出来的东西,运行环境不需要安装gcc 4.4 !
然后看FreeBSD怎么做的:
gcc 4.6的so,安装在/usr/local/lib/gcc46/目录下。如果你是在64位环境下安装的,那么只有64位版本的,没有32位版本的。最关键的是,它确实是一个elf格式的so,而不是文本文件、软链接什么的。
如果在FreeBSD下这么编译一个文件:
# g++46 -o t test.cpp
那么它会错误的链接到4.2的so上
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0×800849000)
libm.so.5 => /lib/libm.so.5 (0x800b59000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x800d7a000)
libc.so.7 => /lib/libc.so.7 (0x800f87000)
你的程序还能不能正常工作,那就看天命了。正确的做法是,在链接的时候加上-Wl,-rpath=/usr/local/lib/gcc46 。
FreeBSD的官网上有一个文档解释了这个问题:http://www.freebsd.org/doc/en/articles/custom-gcc/article.html但是这个文档有点老,而且写的不是很详细。
现在如果只是为了让ports用gcc 4.6,那么直接在/etc/make.conf中加入“USE_GCC=4.6”即可
,
作者 snnn
相关文章推荐
- 一句话讲清楚arm-linux-gcc和arm-elf-gcc的区别?
- linux下用gcc编译使用了math库函数的程序出错的解决方法
- su和sudo的区别 (/libtool: arm-linux-gcc command not found )
- Linux下C开发之gcc,gdb的使用
- Linux下编程工具的使用(2) - GCC编译器
- (原創) 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++)
- arm-linux-gcc和arm-elf-gcc 区别
- 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++) [转]
- [转]Linux CC与Linux GCC的区别概括介绍
- 细小的问题---arm-linux-gcc与arm-elf-gcc的区别
- cc与gcc的区别-linux基础系列(网络查找)
- CU上一个使用linux和FreeBSD的用户BLOG
- arm-linux-gcc和arm-elf-gcc 区别
- arm-linux-gcc 使用笔记1
- Linux系统平台下关于GCC编译及使用的方法
- arm-linux-gcc arm-elf-gcc 区别(转贴)
- linux下使用rpm安装libxml2,gcc,gcc-c++等基本包
- @Register 和 @Import 之间有什么区别呢?什么地方最适合由 ASP.NET 应用程序使用的非系统程序集 DLL?
- 使用uclibc的buildroot制作交叉编译工具链 ,arm-linux-gcc
- arm-linux-gcc和arm-elf-gcc区别