静态链接整个程序

时间:2013-11-27 17:24:21

标签: c++ linux gcc g++ static-linking

我有一个从Windows移植到Linux的c ++应用程序,一切正常,但...... 我们的客户在Debian 3.1上运行的应用程序(sarge),我不能强制gcc版本在目标系统上,我更喜欢使用新的gcc(有一些c ++ 11结构,我想保留)。我想在将来为测试和.so文件制作可执行文件。

我决定静态编译我的procect。

我跑的时候:

g++ -static -o prog obj/sublib1/file1.o obj/sublib1/file2.o obj/sublib2/file1.o obj/sublib2/file2.o (...) -L../somedir -s -lsomestaticlib

我得到了错误:

/usr/lib/gcc/i586-suse-linux/4.8/../../../../i586-suse-linux/bin/ld: cannot find -lm
/usr/lib/gcc/i586-suse-linux/4.8/../../../../i586-suse-linux/bin/ld: cannot find -lc

系统是OpenSuse 13.1 32bit,uname -a:

Linux linux-zfaz.site 3.11.6-4-desktop #1 SMP PREEMPT Wed Oct 30 18:04:56 UTC 2013 (e6d4a27) i686 i686 i386 GNU/Linux

问题可能在于数学库和C库。两个库的动态版本都在/ lib目录中。

(可能没关系:我正在尝试使用代码:: blocks来构建它,但是当问题发生时我已经转移到终端)

我是否需要安装这些库的静态版本?怎么样?

2 个答案:

答案 0 :(得分:0)

如果您使用的是最新版本的g ++,那么您应该选择-static-libstdc++选项。这将确保g ++库静态链接,但系统库(通常没有静态版本)是动态链接的。 (在这种情况下,请勿使用-static。)

答案 1 :(得分:0)

您需要安装glibc-devel-static套餐,但如果适用,@ jameskanze的答案是更好的选择。