在CMake中为每个目标设置编译器/链接器标志

3
我已经为我的项目创建了以下 CMakelists.txt 文件,其中包含需要使用 C 编译的一些文件,然后将与我的 C++ 二进制文件链接。我还在使用 libasan。
cmake_minimum_required(VERSION 3.0)

SET(GCC_COVERAGE_COMPILE_FLAGS "-g3 -fsanitize=address -fno-omit-frame-pointer")
SET(GCC_COVERAGE_LINK_FLAGS    "-fsanitize=address -static-libasan")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")

project(ABC_PROXY VERSION 1.0.0 LANGUAGES C CXX)

add_executable(abc_proxy
src/file1.c
src/main.cpp
)

target_include_directories(abc_proxy PRIVATE /home/vishal/cpp_file/new /home/vishal/cpp_file/new/framework)
SET(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")

在上述文件中,我只有一个目标二进制文件。但现在我想要有两个二进制文件。其中一个将使用libasan编译,另一个将不使用它进行编译。如何为每个二进制目标使用不同的'CMAKE_EXE_LINKER_FLAGS'、'CMAKE_CXX_FLAGS'和'CMAKE_C_FLAGS'标志值?

你有阅读过任何CMake文档吗?你有跟随任何教程吗?你做了哪些研究?https://dev59.com/-18f5IYBdhLWcg3wFvWn - KamilCuk
@KarmilCuk 感谢分享链接...我自己也在你发布链接的同时找到了答案...但是,我不知道如何在同一目标中传递不同的编译标志。 就像在我的情况下...每个目标都使用了两个编译器。 目前传递的是相同的标志...但是将来我可能需要为 C 编译器和 C++ 编译器传递不同的标志(尽管我不知道是否存在这样的用例)。 - Vishal Sharma
if(CMAKE_COMPILER_ID STREQUAL "GNU") target_compile_flags(<flags for GNU compiler>) elseif(CMAKE_COMPILER_ID STREQUAL "MSVC") target_compile_flags(<flags for msvc compiler>) etc... or with generator experssions target_compile_flags($<$<C_COMPILER_ID,GNU>:-flag for gnu>) - KamilCuk
@KamilCuk 我的意思是 gcc 和 g++。 - Vishal Sharma
1
使用生成器表达式target_compile_flags($<$<COMPILE_LANGUAGE:C>:-flag_for_c> $<$<COMPILE_LANGUAGE:CXX>:-flag for cxx>) - KamilCuk
1个回答

5

好的,通过浏览这里不同的答案,我已制作了以下给出的CMakelists.txt,并在该情况下运行。

cmake_minimum_required(VERSION 3.0)

project(ABC_PROXY VERSION 1.0.0 LANGUAGES C CXX)

add_executable(abc_proxy_with_asan
src/file1.c
src/main.cpp
)

set_target_properties(abc_proxy_with_asan PROPERTIES COMPILE_FLAGS "-g3 -fsanitize=address -fno-omit-frame-pointer")
set_target_properties(abc_proxy_with_asan PROPERTIES LINK_FLAGS "-fsanitize=address -static-libasan")
target_include_directories(abc_proxy_with_asan PRIVATE /home/vishal/cpp_file/new /home/vishal/cpp_file/new/framework)

add_executable(abc_proxy
src/file1.c
src/main.cpp
)

set_target_properties(abc_proxy PROPERTIES COMPILE_FLAGS "-g3 -fno-omit-frame-pointer")
target_include_directories(abc_proxy PRIVATE /home/vishal/cpp_file/new /home/vishal/cpp_file/new/framework)

1
在同一个CMake脚本中定义了多个C库时,遇到了“无法确定链接器语言”的问题。由于主目标是C ++,因此使用了project(... LANGUAGES CXX)。当配置和构建graphviz目标时,目标会被配置两次,并且缺少一些CMake魔法来确定链接器语言。将“C”添加到LANGUAGES参数列表中可以解决该问题,感谢您的答案。 - AngryDane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接