【发布时间】: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 文件。但我发现这种方法存在一些问题:
- 我找不到指示
LINK.EXE可执行文件的完全限定路径的CMake 变量。然后,我将不得不使用脆弱的启发式以某种方式得出LINK.EXE的路径:它是脆弱的,因为不同的Visual Studio 版本可能会将LINK.EXE文件定位在不同的目录中,我需要它来为两者工作32 位和 64 位 Windows 编译器条件,并且能够抵御 VS2008 和未来编译器版本之间的升级。 - 我必须找到一种方法来查找其他静态库的所有 .obj 文件,在构建时与在 CMake 时,因为在 CMake 时.obj 文件当然不(总是)存在。出于构建性能的原因,我不想求助于从 .lib 文件中提取 .obj 文件来将它们添加到
LINK.EXE命令行,因此FILE(GLOB...)构造将是我最好的第二个选择案例。 - 可以通过
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