gpt4 book ai didi

linker - 使用 CMake 2.8.x 使用 VS2008 SP1 将多个静态 .lib 文件链接到一个整体 .lib 文件

转载 作者:行者123 更新时间:2023-12-04 10:57:50 28 4
gpt4 key购买 nike

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

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

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

  • 谢谢,

    布伦特

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

    最佳答案

    使用虚拟源文件创建一个“合并”的静态库,并将要合并的库添加到 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

    关于linker - 使用 CMake 2.8.x 使用 VS2008 SP1 将多个静态 .lib 文件链接到一个整体 .lib 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4415460/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com