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

Linker 使用VS2008 SP1和CMake 2.8.x将多个静态.lib文件链接到一个单一的.lib文件,linker,cmake,static-libraries,Linker,Cmake,Static Libraries,与此相关,但不完全相同,我在Windows上使用CMake 2.8.x和VS2008 SP1构建了几个静态库。是否有办法仅通过CMake将所有现有静态库中的所有.obj文件重新链接到一个更大的单片库中,最好是通过add_libraryCMake函数或其他类似构造 我认为答案是“否”,因此我考虑过通过一个自定义命令,通过通常的add\u custom\u命令+add\u custom\u target方法,通过调用LINK.EXE时提供所有其他库.obj文件,手动构建库。但我发现这种方法存在一些问

与此相关,但不完全相同,我在Windows上使用CMake 2.8.x和VS2008 SP1构建了几个静态库。是否有办法仅通过CMake将所有现有静态库中的所有.obj文件重新链接到一个更大的单片库中,最好是通过
add_library
CMake函数或其他类似构造

我认为答案是“否”,因此我考虑过通过一个自定义命令,通过通常的
add\u custom\u命令
+
add\u custom\u target
方法,通过调用
LINK.EXE
时提供所有其他库.obj文件,手动构建库。但我发现这种方法存在一些问题:

  • 我找不到CMake变量,该变量指示指向
    LINK.EXE
    可执行文件的完全限定路径。然后,我将不得不以某种方式使用脆弱的启发式方法导出
    LINK.EXE
    的路径:不同的Visual Studio版本可能会将
    LINK.EXE
    文件定位在不同的目录中,这是脆弱的,我需要它在32位和64位Windows编译器条件下工作,在VS2008和未来的编译器版本之间进行升级时具有弹性
  • 我必须找到一种方法来查找其他静态库的所有.obj文件,在构建时与在CMake时比较,因为在CMake时,.obj文件当然不(总是)存在。出于构建性能的原因,我不希望为了将.obj文件添加到
    LINK.EXE
    命令行而从.lib文件中提取.obj文件,因此在这种情况下,
    文件(GLOB…
    构造将是我最好的第二种选择
  • 可以通过:
    LINK.EXE/OUT:smothetical.lib lib1.lib lib2.lib…
    调用
    LINK.EXE
    ,但可能不包括所有.obj(编辑:我已经确认,
    LINK.EXE
    省略了
    lib1.lib lib2.lib中的一些.obj文件…
    ,没有任何诊断消息解释原因,因此这种方法是不可行的)
    LINK.EXE
    的在线文档对此不清楚。有没有人有过以这种方式使用
    LINK.EXE
    的经验
  • 谢谢

    布伦特

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

    创建一个带有虚拟源文件的静态库“合并”,并将要合并的库添加到静态库标志中,这样它们将成为lib.exe的附加输入

    这将类似于:

    添加_库(合并的STATIC dummy.c)

    设置\u目标\u属性(合并属性
    静态\u库\u标志“full\path\to\lib1.lib full\path\to\lib2.lib”)


    这种方法在MySQL内部使用,这里有一个更通用的宏来合并跨平台工作的静态库。可以在这里找到它

    merge_static_LIBS宏,在链接中定义的宏与我将要实现的非常接近。警告:该链接指向特定于MySQL的文件,因此必须对其进行一般化在实践中可行。上述libutils.cmake确实不能独立工作,因为它引用了可配置的merge_archives_unix.cmake。此文件中的