Dll CMake-构建静态库的困难

Dll CMake-构建静态库的困难,dll,cmake,static-libraries,nmake,Dll,Cmake,Static Libraries,Nmake,因此,几天来我一直在尝试构建libarchive,遵循本指南和许多其他线程: 我想要一个支持LZMA、zlib和bzip2的静态库。我也有这些的静态版本(lib的) 我就是不能让它正常工作。我使用CMAKE为VS2010和NMAKE生成make文件。有了这两个选项,编译就很好了,但是当我尝试使用生成的archive_static.lib时,在我的项目中,我得到了大量未解析的外部文件。编译.dll版本的库可以在没有未解析的外部代码的情况下工作,但是它开始要求zlib.dll、bzip2.dll等,

因此,几天来我一直在尝试构建libarchive,遵循本指南和许多其他线程:

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

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

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

非常感谢您的帮助。

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


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

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


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

因此我认为问题在于,archive_static.lib是静态链接的是,但由于某些原因,zlib、lzma和bzip2不是。如果是这样的话,我怎么能强迫呢?即使我没有可用的dll,但编译后的archive_static.lib与其他3个动态链接是否合理…因此我认为问题在于,archive_static.lib是静态链接的是,但出于某种原因,zlib、lzma和bzip2不是。如果是这样的话,我怎么能强迫呢?即使我没有可用的dll,将archive_static.lib编译为与其他3个动态链接也是合理的……当将二进制文件链接到静态库时,它的外部依赖项不一定会嵌入其中。如果您在整个构建中使用CMake,它实际上会为您解决这一问题(即通过
target\u link\u libraries
提供给静态库的依赖项将传播到链接到该库的所有可执行文件)。@Comicansms sure,但据我所知,OP并不是在使用它的同一个cmake项目中编译libarchive,所以不幸的是,观察不适用。如果单独编译的库导出cmake包配置文件,它也会起作用。但由于libarchive也不这样做,您的反对意见仍然成立。当将二进制文件链接到静态库中时,它的外部依赖项不一定会嵌入其中。如果您在整个构建中使用CMake,它实际上会为您解决这一问题(即通过
target\u link\u libraries
提供给静态库的依赖项将传播到链接到该库的所有可执行文件)。@Comicansms sure,但据我所知,OP并不是在使用它的同一个cmake项目中编译libarchive,所以不幸的是,观察不适用。如果单独编译的库导出cmake包配置文件,它也会起作用。但既然libarchive也不这样做,您的反对意见仍然成立。