Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链接器的CMake生成器表达式_C++_Visual Studio_Linker_Cmake - Fatal编程技术网

C++ 链接器的CMake生成器表达式

C++ 链接器的CMake生成器表达式,c++,visual-studio,linker,cmake,C++,Visual Studio,Linker,Cmake,我想使用CMake和Visual Studio(lib.exe)将几个静态库文件合并到一个库中。我想通过设置将文件列表传递给链接器 set_target_properties(biglib PROPERTIES STATIC_LIBRARY_FLAGS "/unknown/path/lib1.lib /unknown/path/lib2.lib") 但是,在配置时路径未知。所以我尝试使用生成器表达式: set_target_prope

我想使用CMake和Visual Studio(lib.exe)将几个静态库文件合并到一个库中。我想通过设置将文件列表传递给链接器

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>")
设置\u目标\u属性(biglib属性静态\u库\u标志
"$ $")
lib1和lib2是在其他地方定义的内部库目标。 表达式似乎没有计算,因为链接器正在搜索
$
,当然找不到


我不知道我想做的事是否会奏效。也许有人可以解释在这种情况下如何实际使用生成器表达式。我是否需要以某种方式使用add_custom_命令?

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

我建议使用脚本中的宏MERGE_STATIC_LIBS,如下所述:


对于Linux/Unix,您还需要。

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

add_library(lib1 OBJECT ${lib1_src})
add_library(lib2 OBJECT ${lib2_src})
add_library(biglib STATIC $<TARGET_OBJECTS:lib1> $<TARGET_OBJECTS:lib2>) 
add_库(lib1对象${lib1_src})
添加库(lib2对象${lib2\u src})
添加库(biglib STATIC$$)

根据的文档,此处不允许使用生成器表达式(例如,与属性进行比较)。看起来在这里,
add_custom_命令
更合适:合并库与构建库不同。OP明确指出跨平台兼容性不是必需的(“使用CMake和Visual Studio”)。