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

bgo*_*odr 7 linker cmake static-libraries

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

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

  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以这种方式使用的经验?

谢谢,

黑雁

PS,我知道如何使用CMake创建DLL,但我特别不想在此时构建DLL.

Vla*_*oub 11

使用虚拟源文件创建一个"合并"的静态库,并添加要合并到STATIC_LIBRARY_FLAGS的库,这样它们将成为lib.exe的附加输入.

这将是这样的:

ADD_LIBRARY(合并的STATIC dummy.c)

SET_TARGET_PROPERTIES(合并属性
STATIC_LIBRARY_FLAGS"完整\路径\到\ lib1.lib完整\路径\到\ lib2.lib")

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