我正在开发一个使用autoconf,automake和libtool构建的项目。该项目以二进制和源代码形式分发。
在Linux上,默认情况下,构建脚本会动态链接到所有库。这是有道理的,因为Linux用户可以依赖他们的发行版的包管理器来处理依赖关系。
在Windows上,默认情况下,构建脚本使用libtool的-all-static
选项静态链接到所有库。这是有道理的,因为Windows没有提供任何依赖项,并且能够分发包含所有依赖项的单个二进制文件而不是分散大量的DLL是有帮助的。
在OSX上,一些依赖项是由操作系统提供的,有些则不是。因此,动态链接到OS提供的库以及静态链接到其他库将会很有帮助。不幸的是,libtool的all-or-nothing -all-static
选项在这里没有用。
有没有一种方法可以让libtool静态地链接到某些库,但不是全部?
注意:我意识到我可以仔细编译依赖项,以便只有静态构建可用。但是,我宁愿我的项目的构建系统在静态和动态构建的依赖项的常见情况下是健壮的。
注意:当然,我并不关心像C / C ++运行时库这样的低级别依赖项,它们总是在上述所有三个平台上动态链接。
答案 0 :(得分:6)
经过一些研究后,我回答了自己的问题。
如果安装了库的静态和动态版本,并且使用-l
参数链接到该库,则libtool会优先链接到动态版本。如果没有可用的动态构建,或者您传递了-static
或-all-static
选项,它会链接到静态构建。
可以通过提供该库的完整路径来代替-l
选项来强制libtool链接到静态库。