C++ 链接到gcc的旧版本
我有CentOS 6.2(64位,默认为gcc 4.4.6)。不幸的是,我的代码只使用gcc 3.4.6进行编译,所以我(从源代码)在/home/rajat/local下单独安装了gcc。在链接一个简单的“Hello World”程序时,我得到以下信息C++ 链接到gcc的旧版本,c++,linux,gcc,dynamic-linking,C++,Linux,Gcc,Dynamic Linking,我有CentOS 6.2(64位,默认为gcc 4.4.6)。不幸的是,我的代码只使用gcc 3.4.6进行编译,所以我(从源代码)在/home/rajat/local下单独安装了gcc。在链接一个简单的“Hello World”程序时,我得到以下信息 >ldd a.out linux-vdso.so.1 => (0x00007fff215ff000) libstdc++.so.6 => /home/rajat/local/lib64/libstdc++.so.6 (0x0
>ldd a.out
linux-vdso.so.1 => (0x00007fff215ff000)
libstdc++.so.6 => /home/rajat/local/lib64/libstdc++.so.6 (0x00007f11853e7000)
libm.so.6 => /lib64/libm.so.6 (0x00000033be400000)
libgcc_s.so.1 => /home/rajat/local/lib64/libgcc_s.so.1 (0x00007f11851ce000)
libc.so.6 => /lib64/libc.so.6 (0x00000033bd000000)
/lib64/ld-linux-x86-64.so.2 (0x00000033bcc00000)
虽然stdc++和gcc链接到我的3.4.6库,但libm和libc仍然链接到默认库。这样行吗??3.4.6安装也没有生成libm或libc库?是的,没关系
libc/libm是glibc的一部分,而不是gcc编译器。另一方面,libstdc++是gcc的一部分。是的,没关系
libc/libm是glibc的一部分,而不是gcc编译器。另一方面,libstdc++是gcc的一部分。在
/lib
和/usr/lib
中的库以及它们的64位对应项是系统范围的库。它们应该是编译器中立的,除GCC之外的其他编译器也可以链接到它们,而且它们确实可以,特别是因为libc
是与操作系统内核接口的唯一可移植方式
libc
编写器非常小心地编写头文件,使不同的编译器生成相同的二进制内存对象,以便与库中的代码正确地交互。此外,还有一个定义良好的OS ABI接口,所有编译器都遵循该接口,以便彼此兼容。对于C以外的语言,这可能不是真的,例如来自不同C++编译器版本的对象文件很少能很好地相互配合。
特定于编译器的库不安装在
/lib
或/usr/lib
中,有时可以静态链接,以便删除依赖关系。/lib
和/usr/lib
中的库及其64位对应库是系统范围的库。它们应该是编译器中立的,除GCC之外的其他编译器也可以链接到它们,而且它们确实可以,特别是因为libc
是与操作系统内核接口的唯一可移植方式
libc
编写器非常小心地编写头文件,使不同的编译器生成相同的二进制内存对象,以便与库中的代码正确地交互。此外,还有一个定义良好的OS ABI接口,所有编译器都遵循该接口,以便彼此兼容。对于C以外的语言,这可能不是真的,例如来自不同C++编译器版本的对象文件很少能很好地相互配合。
编译器特定的库不安装在
/lib
或/usr/lib
中,有时可以静态链接,以便删除依赖项。这看起来是个坏主意;您需要更新您的代码以使用更现代的编译器进行编译。@trojanfoe-是的,我知道这是个坏主意。但不幸的是,目前我不得不接受它。这看起来是个坏主意;您需要更新您的代码以使用更现代的编译器进行编译。@trojanfoe-是的,我知道这是个坏主意。但不幸的是,目前我不得不接受它。请注意,发行版默认libstdc++位于其中一个库/文件夹中,但该库至少相当依赖于gcc的主要版本。请注意,发行版默认libstdc++位于其中一个库/文件夹中,然而,该库至少相当依赖于gcc的主要versjon。