使用CMake 2.8.x使用VS2008 SP1将多个静态.lib文件链接到一个单片.lib文件中

时间:2010-12-11 06:04:51

标签: linker cmake static-libraries

using cmake to link object files into lib.xxxx.a file相关,但不完全相同,我在Windows上使用CMake 2.8.x使用VS2008 SP1构建了几个静态库。有没有办法通过CMake单独将所有现有静态库中的所有.obj文件重新链接到一个更大的整体库中,最好是通过add_library CMake函数或其他类似的构造?

我认为答案是“不”,因此我考虑通过常规的add_custom_command + add_custom_target方法通过自定义命令滚动自己,只需通过提供手动构建库调用LINK.EXE时所有其他库.obj文件。但我发现这种方法存在一些问题:

  1. 我找不到一个CMake变量来指示LINK.EXE可执行文件的完全限定路径。然后,我必须以某种方式使用脆弱的启发式导出LINK.EXE的路径:在不同的Visual Studio版本可能将LINK.EXE文件放在不同的目录中的意义上它是脆弱的,我需要这个适用于32位和64位Windows编译器条件,并且能够抵御VS2008与未来编译器修订版之间的升级。
  2. 我必须找到一种方法来查找其他静态库的所有.obj文件,在构建时在CMake时间,因为在CMake时间.obj文件当然不会(总是)存在。出于构建性能的原因,我希望不要从.lib文件中提取.obj文件,以便将它们添加到LINK.EXE命令行,因此FILE(GLOB...)构造将是我最好的在这种情况下的第二种选择。
  3. 可以通过LINK.EXE简单地调用LINK.EXE /OUT:monolithic.lib lib1.lib lib2.lib ...,但也许不会包含所有.obj(编辑:我已确认LINK.EXE省略了一些.obj文件lib1.lib lib2.lib ...没有任何诊断消息解释原因,所以这种方法是非首发的); LINK.EXE的在线文档尚不清楚。任何人都有以这种方式使用LINK.EXE的经验吗?
  4. 谢谢,

    布伦特

    P.S。,我知道如何使用CMake创建DLL,但我特别不想在此时建立DLL。

1 个答案:

答案 0 :(得分:11)

创建一个静态库“merged”与虚拟源文件,并添加要合并到STATIC_LIBRARY_FLAGS的库,因此它们将是lib.exe的附加输入。

这就像是:

ADD_LIBRARY(合并STATIC dummy.c)

SET_TARGET_PROPERTIES(合并后的物业
  STATIC_LIBRARY_FLAGS“full \ path \ to \ lib1.lib full \ path \ to \ lib2.lib”)

这种方法在MySQL内部使用,这里有一个更通用的宏来合并工作于crosss-platform的静态库。它可以在http://www.mail-archive.com/cmake@cmake.org/msg28670/libutils.cmake

找到