【发布时间】:2020-07-07 07:24:40
【问题描述】:
我为我的项目创建了以下 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}")
在上面的文件中,我只有一个目标二进制文件。但现在我想要 2 个二进制文件。一个将用 libasan 编译,另一个将在没有它的情况下编译。如何在 'CMAKE_EXE_LINKER_FLAGS' 、 'CMAKE_CXX_FLAGS' 和 'CMAKE_CXX_FLAGS' 中为每个二进制目标使用不同的标志值?
【问题讨论】:
-
您阅读过任何 cmake 文档吗?你有没有遵循任何教程?你做了什么研究? stackoverflow.com/questions/25043458/…
-
@KarmilCuk 感谢分享链接...我自己在您发布该链接的同时找到了答案...但是我不知道如何传递不同的编译标志与我的情况相同的目标...在每个目标中都使用了 2 个编译器。目前正在传递相同的标志......但将来我可能需要为 C 编译器设置不同的标志,为 C++ 编译器设置不同的标志(尽管我不知道是否有任何这样的用例)。
-
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...或使用生成器表达式target_compile_flags($<$<C_COMPILER_ID,GNU>:-flag for gnu>) -
@KamilCuk 我的意思是 gcc 和 g++ btw
-
用于generator expressions
target_compile_flags($<$<COMPILE_LANGUAGE:C>:-flag_for_c> $<$<COMPILE_LANGUAGE:CXX>:-flag for cxx>)