我认为 CMake 的默认行为是不将 project2 链接到外部库,而是将两个库链接到可执行文件。来自“掌握 CMake”一书。
由于静态库不链接到它们所依赖的库,因此 CMake 跟踪库很重要,以便可以在正在创建的可执行文件的链接行上指定它们。
您可以尝试在 CMakeLists2 中使用绝对路径:
add_library (project2 ${sources})
target_link_libraries (project2 "path to ext lib"/"name of ext lib")
或者你可以添加
link_directories ("path_to_library")
到 project1 的 CMakeLists 文件。
如果您真的想在 Visual Studio 中执行类似操作,您可能可以使用此答案中给出的命令在 CMake 中构建 custom_command。它可能看起来像这样(我没有测试它)。
set(EXT_LIB "path_to_library/name_of_external_lib")
set(BIG_LIB "path_to_big_lib/name_of_big_lib")
add_library (project2 ${sources})
get_property(PROJ2_LOC TARGET project2 PROPERTY LOCATION)
add_custom_command(OUTPUT ${BIG_LIB}
DEPENDS ${EXT_LIB} project2
COMMAND "lib.exe /OUT:${BIG_LIB} ${EXT_LIB} ${PROJ2_LOC} )
然后你可以将你的可执行文件与${BIG_LIB}链接起来。
您必须考虑的一些事项:
- Maybe you have to use LOCATION_CONFIG (CMake docs, I found the get_property command in this answer )
- link.exe has to be in your path
- watch the scope of the BIG_LIB variable if you want to use it in an other CMakeLists.txt