如何静态链接使用了./configure的Linux软件?

29

我想要编译 NRPE 静态文件,这样我就可以将编译好的二进制文件复制到一个没有gcc安装的OmniOS服务器上。虽然我更希望从存储库安装支持SSL的NRPE,但似乎并不存在这样的选项,因此我想自己编译它。然而,./configure 脚本似乎没有静态选项。

~/nrpe-2.15# ./configure --help | grep static
~/nrpe-2.15# ./configure --help | grep share
  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]

问题

我要如何编译一个使用 configure 的程序静态地?


1
似乎这个软件包不支持静态链接... - Claudio
1
可能是 如何为复杂程序进行静态链接 的重复问题。 - Gerald Senarclens de Grancy
2个回答

38

试试这个:

./configure LDFLAGS="-static"

但是我收到了很多警告:在静态链接的应用程序中使用“xxx”需要在运行时使用与链接所使用的glibc版本相对应的共享库。 - gatopeich
是的,没错,有一些东西将在运行时被 dlopen。我想 DNS 查询就需要这样做。这并不理想。 :-( - ams
如果您试图静态链接到glibc,那么无论如何都无法在需要illumos libc的OmniOS上运行 - glibc仅适用于Linux内核。 - alanc
5
当我运行这个标志时,出现了“configure: error: C++ compiler cannot create executables”的错误。 - Bryce Guinta
3
我的错误是由于缺少libstdc++-static包引起的,因为涉及的程序使用了C ++。 这篇教程帮助了我 - Bryce Guinta

28

如果你在构建过程中使用了libtool,请注意以下步骤:

  1. ./configure CFLAGS="-static" ....
  2. make LDFLAGS="-all-static"

你可以通过libtool --help --mode=link查看如何使用-all-static参数。


5
这里很重要的一点是,如所示,“LDFLAGS =” - all-static“”只在给“make”时使用,并且不会在“./configure”时间设置,否则它会破坏配置脚本(因为只有“libtool”包装器才接受它,像“gcc”这样的编译器本身不接受)。 - nh2
1
又一个让人讨厌的自动化工具的原因。:( - user1202136
1
提醒一下,务必注意从“configure”的输出中记录生成的LDFLAGS。您可能需要重新添加任何其他选项,例如-L以包括特定的库路径。 - Mr. Llama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接