与using cmake to link object files into lib.xxxx.a file相关,但不完全相同,我在Windows上使用CMake 2.8.x使用VS2008 SP1构建了几个静态库。有没有办法通过CMake单独将所有现有静态库中的所有.obj文件重新链接到一个更大的整体库中,最好是通过add_library
CMake函数或其他类似的构造?
我认为答案是“不”,因此我考虑通过常规的add_custom_command
+ add_custom_target
方法通过自定义命令滚动自己,只需通过提供手动构建库调用LINK.EXE
时所有其他库.obj文件。但我发现这种方法存在一些问题:
LINK.EXE
可执行文件的完全限定路径。然后,我必须以某种方式使用脆弱的启发式导出LINK.EXE
的路径:在不同的Visual Studio版本可能将LINK.EXE
文件放在不同的目录中的意义上它是脆弱的,我需要这个适用于32位和64位Windows编译器条件,并且能够抵御VS2008与未来编译器修订版之间的升级。LINK.EXE
命令行,因此FILE(GLOB...)
构造将是我最好的在这种情况下的第二种选择。LINK.EXE
简单地调用LINK.EXE /OUT:monolithic.lib lib1.lib lib2.lib ...
,但也许不会包含所有.obj(编辑:我已确认LINK.EXE
省略了一些.obj文件lib1.lib lib2.lib ...
没有任何诊断消息解释原因,所以这种方法是非首发的); LINK.EXE
的在线文档尚不清楚。任何人都有以这种方式使用LINK.EXE
的经验吗?谢谢,
布伦特
P.S。,我知道如何使用CMake创建DLL,但我特别不想在此时建立DLL。
答案 0 :(得分:11)
创建一个静态库“merged”与虚拟源文件,并添加要合并到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内部使用,这里有一个更通用的宏来合并工作于crosss-platform的静态库。它可以在http://www.mail-archive.com/cmake@cmake.org/msg28670/libutils.cmake
找到