CMake-构建静态库的困难

Posted

技术标签:

【中文标题】CMake-构建静态库的困难【英文标题】:CMake- Difficulties building static library 【发布时间】:2013-09-11 00:32:13 【问题描述】:

所以我这几天一直在尝试构建 libarchive,遵循本指南和许多其他线程:https://github.com/libarchive/libarchive/wiki/BuildInstructions

我想要一个支持 LZMA、zlib 和 bzip2 的静态库。我也有这些的静态版本(lib)

我只是无法让它正常工作。我使用 CMAKE 为 VS2010 和 NMAKE 生成 make 文件。使用这两个选项,事情编译得很好,但是当我尝试使用生成的 archive_static.lib 时,在我的项目中我得到了大量未解决的外部。编译库的 .dll 版本可以在没有未解析的外部的情况下工作,但随后它开始询问我没有也不想使用的 zlib.dll、bzip2.dll 等。

我想我需要用 cmake 设置一些标志,但我不知道该怎么做。

非常感谢任何帮助。 http://www.libarchive.org/

【问题讨论】:

所以我认为问题在于,archive_static.lib 是静态链接的,但由于某种原因,zlib、lzma 和 bzip2 不是。如果是这样的话,我怎么能强迫它呢?编译为与其他 3 个动态链接的 archive_static.lib 是否合理,即使我没有可用的 dll... 【参考方案1】:

我不能确定这是否是这里发生的事情,但请记住,将二进制文件链接到静态库时,它的外部依赖项不一定嵌入其中,这意味着您可能需要提供静态库您的程序通过 libarchive 间接依赖的库,在您的情况下,即 LZMA、zlib 和 bzip2。

此外,在链接静态与动态时,Windows 上存在一些混淆,因为在这两种情况下,您都提供了一个 .lib 文件,因此很容易混淆并提供动态链接的 .lib,而不是静态版本。如果您这样做,链接器可能会拒绝链接您的程序(尤其是在 boost 中发生),或者可能链接得很好,然后,在执行时,操作系统将需要相应的 .dll。

【讨论】:

将二进制文件链接到静态库时,其外部依赖项不一定嵌入其中。如果您在整个构建中使用 CMake,它实际上会为您解决这个问题(即,通过 target_link_libraries 提供给静态库的依赖项将传播到链接到该库的所有可执行文件)。 @ComicSansMS 当然,但据我了解,OP 并没有在他使用它的同一个 cmake 项目中编译 libarchive,所以不幸的是,观察不适用 如果单独编译的库导出CMake包配置文件也可以。但是由于 libarchive 也不这样做,所以您的反对意见仍然成立。

以上是关于CMake-构建静态库的困难的主要内容,如果未能解决你的问题,请参考以下文章

使用cmake构建静态库的静态库

CMake 学习四:CMake 构建静态库和动态库

在 CMake 中安装静态库的调试和发布配置

使用 CMake 将几个静态库合并为一个

CMake:检查静态 C++ 库的可用性

如何使用cmake生成基于静态库的动态链接库