【问题标题】:setting compiler/linker flags per target in CMake [duplicate]在CMake中为每个目标设置编译器/链接器标志[重复]
【发布时间】: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>)

标签: c++ c cmake


【解决方案1】:

好的,所以在这里浏览了不同的答案后,我制作了下面给出的 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)

【讨论】:

  • 在同一 cmake 脚本中定义的多个 c 库遇到“无法确定链接器语言”。由于主要目标为c ++,因此使用了项目(...LANGUAGES CXX)。当配置和构建graphviz目标时,目标被配置两次,并且错过了一些cmake魔术来找出链接器语言。将“C”添加到 LANGUAGES 参数的列表中解决了问题,感谢您的回答
猜你喜欢
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多