gpt4 book ai didi

linux - 如何静态链接 libexpat.so.1 与 GCC?

转载 作者:太空宇宙 更新时间:2023-11-04 12:29:00 24 4
gpt4 key购买 nike

我想使用没有共享依赖项的 GCC/G++ 构建静态程序。但我不知道该怎么做。

在 Netbeans IDE 中使用以下命令我可以使用共享依赖项进行构建,但是在某些操作系统中找不到这个库(我不想在新系统上安装)

-Wl,--dynamic-linker=/usr/lib/libexpat.so.1

最佳答案

要静态链接程序,您需要静态库,这是一个文件名以.a 结尾的库。

链接器,默认情况下,如果使用默认搜索路径(如您使用 /usr/lib),将选择 .so 库版本 并将做一个动态链接,所以如果你想指定你想要一些静态你需要指定它的完整路径名 ,而不是使用 -l 选项。所以,

gcc -o your_program mod_a.o mod_b.o ... /usr/lib/libexpat.a

优于

gcc -o your_program mod_a.o mod_b.o ... -lexpat

(后者将选择文件 /usr/lib/libexpat.so,它应该是指向 /usr/lib/libexpat.so.1 的链接,通常是库的soname,也是/usr/lib/libexpat.so.1.xx.xx)

的符号链接(symbolic link)

注意

在示例中,我试图通过编译器调用链接器,因为默认的 c 运行时和库在以这种方式调用时由编译器自动选择。如果您更喜欢直接调用链接器,过程不会改变,但是您必须自己添加C 运行时模块和标准c 库。

注2

如果你想静态链接一切,那么你必须使用你将要使用的所有库的静态版本(它们通常安装在与动态库相同的目录中,所以你必须在命令行中指定所有的完整路径名)为了在永久开发系统中解决这个问题,您可以从另一个路径对它们进行符号链接(symbolic link),然后将该目录指定为必须静态的项目的搜索路径链接。

如果你总是希望一些库被静态链接,只需删除 .so 链接(不是 .so.X.so.X .YY链接,编译器不尝试)在/usr/lib中,编译器默认选择.a文件。当然,如果你想为每个库都制作这个,你可以删除所有的 .so 链接,但是你最终会得到比原始动态链接版本更大(大得多)的可执行文件。

关于linux - 如何静态链接 libexpat.so.1 与 GCC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43821258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com