如何处理CMake中的gcc链接选项(如整个存档, - 允许多个定义)?

时间:2016-05-30 12:40:05

标签: gcc cmake

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

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

top_dir/sub_dir1/CMakeLists.txt用于使用lib1构建add_library(lib1 ...)top_dir/sub_dir2/CMakeLists.txt用于构建exe1lib1target_link_library(exe1 lib1)相关联。

top_dir / CMakeLists.txt的内容如下:

add_subdirectory(sub_dir2) 
add_subdirectory(sub_dir1) 

通常,在构建目标exe1时,cmake会检查dependency,因此在构建lib1之前将构建exe1。问题是我正在将一个现有的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吗?

1 个答案:

答案 0 :(得分:1)

target_link_libraries的参数按照它们出现的顺序进入结果命令行。只要目标名称用作参数,就会在结果命令行中使用目标输出的路径。因此,只要在命令行中需要指向该库的路径,就可以使用库目标:

target_link_libraries(exe1 -Wl,--whole-archive lib1 -Wl,--no-whole-archive)

这样一种方式,可执行文件 exe1 和库 lib1 之间的目标级依赖关系会像往常一样由CMake自动推断出来。