我有一个演示项目,它structure
如下所示:
top_dir
CMakeLists.txt
sub_dir1
CMakeLists.txt
sub_dir2
CMakeLists.txt
top_dir/sub_dir1/CMakeLists.txt
用于通过使用add_library(lib1 ...)
来构建lib1
, top_dir/sub_dir2/CMakeLists.txt
用于通过target_link_library(exe1 lib1)
构建具有链接lib1
的exe1
。
而top_dir/CMakeLists.txt的内容如下:
add_subdirectory(sub_dir2)
add_subdirectory(sub_dir1)
通常,当构建目标exe1
时,cmake 会检查dependency
,以便在构建exe1
之前构建lib1
。问题是我正在将一个现有的makefile项目转移到CMake中,并且有很多gcc link options
,比如"whole-archive ... no-whole-archive, allow-mutiple-definition"
,如果使用像target_link_library(exe1 "-Wl, --whole-archive ../sub_dir1/liblib1.a --no-whole-archive")
(像这样的形式,这可能不起作用,它只是一个例如),cmake似乎不再lib1
构建。有什么方法可以使用target_link_library
,例如 target_link_library(exe1 "-Wl, --whole-archive ../sub_dir1/liblib1.a")
和 cmake 链接依赖关系检查仍然有效,或者我可以将这些 gcc 链接选项转移到 cmake 中的其他方法?
target_link_libraries
的参数按照它们出现的顺序进入结果命令行。每当将目标名称用作参数时,都会在结果命令行中使用目标输出的路径。因此,只要您需要在命令行中找到该库的路径,您就可以使用库目标:
target_link_libraries(exe1 -Wl,--whole-archive lib1 -Wl,--no-whole-archive)
这样,CMake 会像往常一样自动推断可执行 exe1 和库 lib1 之间的目标级依赖关系。
下一个黑客允许在本地定义要应用标志的库的标志,而无需修改所有 exe 链接标志:
add_library(lib1_internal STATIC lib1.cpp)
add_library(lib1 STATIC dummy.cpp) # dummy.cpp is an empty file
target_link_libraries(lib1 PRIVATE -Wl,--whole-archive lib1_internal -Wl,--no-whole-archive )
....
target_link_libraries(exe1 lib1)