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-构建静态库的困难的主要内容,如果未能解决你的问题,请参考以下文章