我已根据以下内容从源代码安装了gcc-7.1.0:https://gcc.gnu.org/install/index.html以使用更新的gcc。
已编译的二进制文件与libgcc
具有额外的依赖关系:
$ ldd a.out
linux-vdso.so.1 => (0x00007fffd85fd000)
librt.so.1 => /lib64/librt.so.1 (0x000000365b400000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000365a800000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x000000301ae00000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x000000365b000000)
libc.so.6 => /lib64/libc.so.6 (0x000000365a000000)
/lib64/ld-linux-x86-64.so.2 (0x0000003659c00000)
我没有选择任何特定的配置选项(--prefix
除外)并使用默认值安装。查看config.log
,似乎配置决定默认情况下无法执行此操作。相关部分:
configure:5038: checking whether g++ accepts -static-libstdc++ -static-libgcc
configure:5055: g++ -o conftest -g -O2 -static-libstdc++ -static-libgcc conftest.cpp >&5
g++: unrecognized option '-static-libstdc++'
conftest.cpp:11:2: error: #error -static-libstdc++ not implemented
configure:5055: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME ""
| #define PACKAGE_TARNAME ""
| #define PACKAGE_VERSION ""
| #define PACKAGE_STRING ""
| #define PACKAGE_BUGREPORT ""
| #define PACKAGE_URL ""
| /* end confdefs.h. */
|
| #if (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)
| #error -static-libstdc++ not implemented
| #endif
| int main() {}
configure:5059: result: no
(上面使用的g++
- 有点旧:g ++ 4.1.2如果相关的话。)
我只编译C代码。因此,如果没有静态链接支持-static-libstdc++
,那不是问题。但我不明白为什么libgcc
与-static-libstdc++
绑定。
libgcc_s.so.1
并非在所有计算机上始终可用。虽然我可以安装它,但我不希望对我的客户有额外的要求。有什么办法可以消除这种依赖吗?
虽然使用-static-libgcc
切换确实会删除libgcc_s.so.1
,但我正在寻找让gcc本身执行此操作的方法。如果这意味着重新配置并重新安装gcc,我就可以了。
P.S。:我还必须遵循这里的解决方法:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61955因为机器有点老了。
答案 0 :(得分:4)
但我不明白为什么libgcc与-static-libstdc ++绑定。
不是。 configure配置测试控制引导期间的中间编译器是静态链接还是动态链接,它与最终GCC生成的可执行文件无关。
libgcc_s.so.1
并非在所有计算机上始终可用。虽然我可以安装它,但我不希望对我的客户有额外的要求。有什么办法可以消除这种依赖吗?
恕我直言,它应该安装,很多的包依赖它。
可执行文件依赖于libgcc,因为它们使用来自该库的东西。与-static-libgcc
关联以使用libgcc.a
代替libgcc_s.so
。如果您希望自动发生这种情况,请在新GCC周围安装一个包装器脚本,始终将其添加到命令行参数中,或者使用始终添加该选项的自定义specs file,例如:通过以下方式配置GCC:
--with-specs=%{!shared-libgcc:-static-libgcc}
这应该意味着-static-libgcc
总是隐式使用,除非在命令行中明确提供-shared-libgcc
。我没有测试过它。
答案 1 :(得分:-2)
gcc-7.1.0依赖于libgcc_s.so.1(或静态),版本7.1.0 ,它必须随&#34; gcc-7.1.0软件包提供&# 34 ;.
当gcc作为自包含文件夹提供时,轻松完成。 (gcc7 /)这通常是额外编译器最方便的解决方案。
参考。 http://www.linuxfromscratch.org/lfs/view/development/ →→http://www.linuxfromscratch.org/lfs/view/development/chapter05/gcc-pass2.html(GFS人员推荐使用LFS方法。)
示例, - prefix = / opt / gcc7或--prefix = / usr / localgcc7
../gcc-7.1.0/configure --prefix=/opt/gcc7 --program-suffix=7 --enable-languages=c,c++ --disable-multilib
制作链接:cd /usr/bin/ && ln -s [path-to]/gcc7/bin/gcc7 && ln -s [path-to]/gcc7/bin/g++7
从上面创建一个package.deb,package.rpm也很容易。
?谁想要没有c ++编译器?建议:包括g ++。