如果要静态链接整个程序,则应将--disable-shared 选项传递给configure。您可能需要也可能不需要传递--enable-static,具体取决于该选项的默认值(您可以通过configure.ac 文件影响)。你真的应该考虑这样做。
您还应该考虑将其作为安装程序的问题,而不是构建系统的问题。让安装程序负责确保程序所需的所有共享库都由安装它的系统提供。这是非常常见的;事实上,它是 yum / dnf 和 apt 等包管理系统及其底层打包格式的灵感之一。
如果您坚持只静态链接一个库,而动态链接其他所有库,那么您将需要跳过更多的环节。目标是发出链接选项,仅导致该库被静态链接,而不更改其他库的链接。使用 GNU 工具链,并假设程序是动态链接的,这将是以下选项组合:
-Wl,-Bstatic -lfoobar -Wl,-Bdynamic
现在考虑the documentation of the AC_CHECK_LIB() macro:
宏:AC_CHECK_LIB (library, function, [action-if-found],
[action-if-not-found], [other-libraries])
[...] action-if-found 是与库的链接成功时要运行的 shell 命令列表; action-if-not-found 是一个shell列表
链接失败时运行的命令。如果 action-if-found 不是
指定,默认操作将 -llibrary 前置到 LIBS 并定义
'HAVE_LIBlibrary'(全部大写)。 [...]
请特别注意在未提供可选参数的情况下的默认行为(您目前的情况)——这不是您想要的,至少不是您想要的。我建议至少为 action-if-found 的情况提供一种替代行为,您也可以考虑在 action-if-not-found 的情况下使configure 失败。后者留作练习;仅实现前者可能如下所示:
AC_CHECK_LIB([foobar], [foobar_init], [
LIBS="-Wl,-Bstatic -lfoobar -Wl,-Bdynamic $LIBS"
AC_DEFINE([HAVE_LIBFOOBAR], [1], [Define to 1 if you have libfoobar.])
])
您还应该注意AC_CHECK_LIB() 调用的顺序。正如其文档继续说的那样:
此宏旨在支持从右到左构建LIBS
(最不依赖到最依赖)时尚,例如图书馆
依赖关系被满足为连续的自然副作用
测试。链接器对库排序很敏感,因此其中的顺序
生成LIBS 对库的可靠检测很重要。
如果你发现你仍然没有得到你想要的,那么看看make实际执行的链接命令。在确定如何解决问题之前,您需要了解它们的问题所在。
话虽如此,我观察到上述处理基本上是一种 hack,它使您的构建系统的弹性大大降低。它引入了对 GNU 工具链选项的依赖(一些其他工具链可能仍然接受),并假设动态链接正在整体上执行。使用额外的 Autoconf 代码或许可以解决这些问题,但我强烈建议您改用我描述的前两个替代方案之一。