与 使用cmake将目标文件链接到lib.xxxx.a文件 相关,但不完全相同,我使用 CMake 2.8.x 在 Windows 上构建了几个静态库,使用的是 VS2008 SP1。是否可以仅通过 CMake 将所有现有静态库中的 .obj 文件重新链接为一个更大的单体库,最好是通过
我认为答案是否定的,因此我考虑通过自定义命令来滚动我的方法,通过通常的
add_library
CMake 函数或其他类似结构实现?我认为答案是否定的,因此我考虑通过自定义命令来滚动我的方法,通过通常的
add_custom_command
+ add_custom_target
方法,手动构建库,通过在调用 LINK.EXE
时提供所有其他库的 .obj 文件来完成。但我看到该方法存在一些问题:
- 我找不到一个 CMake 变量来指示
LINK.EXE
可执行文件的完全限定路径。然后,我必须使用脆弱的启发式方法来推导出LINK.EXE
的路径:这种方法是脆弱的,因为不同的 Visual Studio 版本可能会将LINK.EXE
文件定位在不同的目录中,而我需要它能在 32 位和 64 位 Windows 编译条件下工作,并且对 VS2008 和未来编译器修订之间的升级具有弹性。 - 我需要找到一种在构建时而不是在 CMake 时间找到其他静态库的所有 .obj 文件的方式,因为在 CMake 时间上,这些 .obj 文件当然不存在(并非总是存在)。出于构建性能的原因,我不想从 .lib 文件中提取 .obj 文件以便将它们添加到
LINK.EXE
命令行,所以在这种情况下,使用FILE(GLOB...)
结构将是我的最佳备选方案。 - 可能可以通过简单地调用
LINK.EXE
来实现:LINK.EXE /OUT:monolithic.lib lib1.lib lib2.lib ...
,但可能并不是所有的 .obj 文件都会被包含 (编辑:我已经确认LINK.EXE
会省略来自lib1.lib lib2.lib ...
的某些 .obj 文件,并且没有诊断消息解释为什么,因此这种方法行不通);关于使用LINK.EXE
的这种方式的在线文档也不是很清楚。任何人有过使用LINK.EXE
的经验吗?
谢谢,
Brent
附注:我知道如何使用CMake创建DLL,但我特别不想在此时使用DLL。