【问题标题】:Linking multiple static .lib files into one monolithic .lib file using VS2008 SP1 using CMake 2.8.x使用 CMake 2.8.x 使用 VS2008 SP1 将多个静态 .lib 文件链接到一个整体 .lib 文件
【发布时间】:2010-12-11 06:04:50
【问题描述】:

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

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

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

谢谢,

布伦特

P.S.,我知道如何使用 CMake 创建 DLL,但我现在特别不想求助于构建 DLL。

【问题讨论】:

    标签: linker cmake static-libraries


    【解决方案1】:

    使用虚拟源文件创建一个“合并”的静态库,并将要合并的库添加到 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 内部使用,这里有一个更通用的宏来合并跨平台工作的静态库。可以在这里找到http://www.mail-archive.com/cmake@cmake.org/msg28670/libutils.cmake

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    相关资源
    最近更新 更多