在gcc中使用静态和dynamic链接库
我需要分发一个可以在尽可能多的x86 Linux发行版上运行的二进制文件。 这意味着我必须静态链接一些库,比如glibc,因为用户可能没有我使用的版本。 其他库必须dynamic链接,如fontconfig,因为它依赖于caching文件格式和每个系统上可能不同的硬编码位置。
什么是命令行选项来做到这一点? 如果我指定-static,那么gcc将拒绝dynamic链接任何库。
在现代UNIX或Linux系统上静态链接任何系统库,尤其是针对libc
,使得二进制文件的可移植性显着降低 。 只是不要这样做。
相反,使用向后兼容性(在旧系统上链接的二进制文件继续在所有新的系统上运行),或者通过链接旧系统上的二进制文件(我使用RedHat 6.2,而且我还没有看到Linux系统在哪里我的二进制文件不会在过去的8年中运行),或者使用类似autopackage的东西。
回答你原来的问题:
gcc main.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic
会导致链接器使用libfoo的存档版本。 [重要的是具有后面的-Wl,-Bdynamic
所以你不强制使用静态libc。]
尝试传递链接器命令行链接的库文件的path(不pipe是.a还是.so库),并且是静态的。 这应该够了吧。
应该指出的是,在Linux下,只有(安全)静态链接一个库,如果没有dynamic库依赖它。 这意味着如果你使用任何dynamic库,你可以忘记静态链接libc。 只是用一个相当老的版本来打造针对libc的情况; 多年来,libc一直保持强劲的ABI向后兼容性。
- 使用FFI声明时GHCi运行时链接程序问题
- 用C覆盖函数调用
- 错误LNK2005:xxx已经在MSVCRT.lib中定义(MSVCR100.dll)C:\ something \ LIBCMT.lib(setlocal.obj)
- 如何在Mac OSX下使用gcc设置可执行文件的运行时path(-rpath)?
- GCC C ++链接器错误:未定义的引用'XXX的虚拟表',未定义的引用'ClassName :: ClassName()'
- 我怎么能从一个.map文件graphics显示内存布局?
- 连接器是做什么的?
- g ++连接器:如果静态库存在,强制静态链接?
- dynamic链接时共享库中的全局variables和静态variables会发生什么变化?