CMake生成器表达式到链接器

时间:2016-01-26 09:10:56

标签: c++ visual-studio linker cmake

我想使用CMake和Visual Studio(lib.exe)将几个静态lib文件合并到一个单独的lib中。我想通过设置

将文件列表传递给链接器
set_target_properties(biglib PROPERTIES STATIC_LIBRARY_FLAGS 
                             "/unknown/path/lib1.lib /unknown/path/lib2.lib")

但是,配置时路径未知。所以我尝试使用生成器表达式:

set_target_properties(biglib PROPERTIES STATIC_LIBRARY_FLAGS 
                             "$<TARGET_FILE:lib1> $<TARGET_FILE:lib2>")

lib1和lib2是在其他地方定义的内部库目标。 表达式似乎没有被评估,因为链接器正在搜索当然未找到的$<TARGET_FILE:lib1>

我不知道我尝试做的事情是否会起作用。也许有人可以解释如何在这种情况下实际使用生成器表达式。我是否需要以某种方式使用add_custom_command?

2 个答案:

答案 0 :(得分:1)

合并静态库是一项相对复杂的任务,它还依赖于平台和编译器。例如,使用Linux / gcc,您需要通过ar从库中提取所有对象,然后将它们组合回合并的库。

我建议使用libutils.cmake脚本中的宏MERGE_STATIC_LIBS,如下所述:https://stackoverflow.com/a/4736442/1274747

对于Linux / Unix,您还需要merge_archives_unix.cmake.in

答案 1 :(得分:0)

您可以将lib1和lib2目标定义为对象库:

add_library(lib1 OBJECT ${lib1_src})
add_library(lib2 OBJECT ${lib2_src})
add_library(biglib STATIC $<TARGET_OBJECTS:lib1> $<TARGET_OBJECTS:lib2>)