如何在CMake中处理gcc链接选项(如整个存档,--allow-multi-definition)?



我有一个演示项目,它structure如下所示:

top_dir 
    CMakeLists.txt 
    sub_dir1 
        CMakeLists.txt 
    sub_dir2 
        CMakeLists.txt 

top_dir/sub_dir1/CMakeLists.txt用于通过使用add_library(lib1 ...)来构建lib1top_dir/sub_dir2/CMakeLists.txt用于通过target_link_library(exe1 lib1)构建具有链接lib1exe1

而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)

最新更新