我想用GCC / G ++构建静态程序而不需要共享依赖项。但我不知道该怎么做。
使用Netbeans IDE中的以下命令,我可以使用共享依赖构建,但在某些操作系统中找不到此库(我不想在新系统上安装)
-Wl,--dynamic-linker=/usr/lib/libexpat.so.1
答案 0 :(得分:0)
要静态链接程序,您需要一个静态库,这是一个文件名以.a
结尾的库。
链接器,如果使用默认搜索路径(与/usr/lib
一样),则会选择.so
库版本,并会对其进行动态链接 ,所以如果你想要指定一些静态library
,,你需要指定它的完整路径名,而不是使用-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
的链接,/usr/lib/libexpat.so.1.xx.xx
通常是库的名字,也是.so
的符号链接)
在示例中,我试图通过编译器调用链接器,因为默认的c运行时和编译器在调用这种方式时会自动选择它们。如果您更喜欢直接调用链接器,则该过程不会更改,但您必须自己添加 C 运行时模块和标准c库。
如果你想静态链接所有,那么你必须使用你将要使用的所有库的静态版本(它们通常安装在与动态库相同的目录中,所以你必须在命令行中指定all的完整路径名。为了在永久开发系统中处理此问题,您可以从另一个路径创建它们的符号链接,然后将该目录指定为必须静态的项目的搜索路径联的。
如果你总是想要某个库静态链接,只需删除.so.X
链接(不是.so.X.YY
和/usr/lib
链接,编译器不会尝试它们){ {1}},编译器默认选择.a
文件。当然,如果你想要为每个库创建这个,你可以删除所有.so
链接,但是你会以比原始动态链接版本更大的可执行文件(更大)结束。