我想使用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?
答案 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>)