cmake 如何为单个头文件设置不同的编译器选项?

iyfjxgzm  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(241)

我有一个CMAKE文件,其中包含以下编译标志

set (CMAKE_CXX_FLAGS_DEBUG  "${CMAKE_CXX_FLAGS_DEBUG} \
    -fPIC -Wall -pedantic -Wextra -Werror \
    -Wno-missing-braces -Wno-unused-variable \
    -Wno-ignored-qualifiers  -fdiagnostics-color")

我想省略单个头文件的-Wextra选项;/externals/include/foo.hpp(这是一个第三方的只包含头文件的库,并给出错误:[-Werror=unused-parameter](编译时)。
我试过set_source_files_properties

set_source_files_properties(${EXTERNALS_SOURCE_DIR}/foo.hpp PROPERTIES COMPILE_FLAGS  "${CMAKE_CXX_FLAGS_DEBUG} -Wno-extra")

但无法消除编译错误。
有没有办法在CMAKE中或者在头文件中使用#pragmas来实现这一点?
谢谢

解决方案以下是我如何摆脱错误:

  • 创建一个文件foo_wrapper. hpp。
  • Add _pragma忽略trouble maker编译标志
  • 在项目中的任何地方都使用 Package 器头,而不是实际的头。

` //在foo_wrapper.hpp文件中:

_Pragma("GCC diagnostic push")

   _Pragma("GCC diagnostic ignored \"-Wunused-parameter\"")

   #include "foo.hpp"

   _Pragma("GCC diagnostic pop")

v1l68za4

v1l68za41#

在当前的编译器上,不可能通过构建选项来完成此操作。
这是因为构建模型的工作方式:编译器将为每个源文件调用一次,并且该源文件包含的所有头文件将始终使用与源文件本身相同的构建选项。所以CMake在这里无法帮助您。
一些编译器允许通过#pragma s关闭某些警告。例如,MSVCgcc。检查你的编译器的手册,了解他们在这方面提供了什么。不幸的是,这将永远是不可移植的,所以如果您有一个支持许多编译器的代码库,#pragma可能会变得很长。我建议写一个 Package 器头,只包括第三方头给你的麻烦,并照顾所有的警告禁用。在你的项目中,你总是包含 Package 器,而不是原始的第三方头。

相关问题