【问题标题】:Link whole program statically静态链接整个程序
【发布时间】:2013-12-13 11:38:00
【问题描述】:

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

我决定静态编译我的过程。

当我跑步时:

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 目录中。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 这个答案可能会起作用(谢谢!),但它不会导致:FATAL: kernel too old,似乎需要摆脱 c++11 功能,并尝试在 Debian 上重新编译它3.1.
    【解决方案2】:

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

    【讨论】:

    • 此解决方案在旧 Debian 中出现错误:./prog: /lib/libgcc_s.so.1: version 'GCC_4.2.0' not found (required by ./sarmata_c++)。同时使用 -static-libstdc++-static-libgcc 给我:./prog: relocation error: ./prog: undefined symbol: _ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE
    • 想要-static_libgcc,至少在Linux系统上(可能没有)。由于各种历史原因,除非我弄错了,否则libgcc 还涵盖了传统的libc,它不应该是静态链接的。至于其余的,我也遇到了版本控制问题。我认为这与 g++ 和 libstdc++ 的安装方式有关,但我从来没有机会跟进并找出答案。 (还要注意,对 -static-libstdc++ 的支持是最近才支持的;旧版本的 g++/libstdc++ 可能不支持它,或者可能无法正确支持它。)
    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多