我有一个演示项目,它的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
用于构建exe1
,lib1
与target_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吗?
答案 0 :(得分:1)
target_link_libraries
的参数按照它们出现的顺序进入结果命令行。只要目标名称用作参数,就会在结果命令行中使用目标输出的路径。因此,只要在命令行中需要指向该库的路径,就可以使用库目标:
target_link_libraries(exe1 -Wl,--whole-archive lib1 -Wl,--no-whole-archive)
这样一种方式,可执行文件 exe1 和库 lib1 之间的目标级依赖关系会像往常一样由CMake自动推断出来。