c++ - 如何在CMake中为 native 代码和外部代码设置不同的编译器警告级别

标签 c++ cmake compiler-warnings

假设我正在为自己的代码设置相当严格的编译器警告级别,但问题是我的代码依赖于一个编写得不太严格的外部库,所以当我包含来自外部库的头文件时,我收到各种警告。有没有办法可以为 CMake 中的不同文件设置不同的警告级别?

这是一个显示情况的示例,假设我有 main.cpp

#include "external.h"

int main(){
  // some code
}

以及相应的CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(Test)

set(PROJECT_SRCS
${PROJECT_SOURCE_DIR}/main.cpp
)

if(MSVC)
  if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
    string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
  else()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
  endif()
elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wall -Werror -Wshadow")
endif()

include_directories(${EXTERNAL_INC})

add_executable(Test ${PROJECT_SRCS})

target_link_libraries(Test ${EXTERNAL_LIB})

假设“external.h”导致 -Wshadow 警告,我可以取出 -Wshadow,但这也意味着我的 native 代码不会捕获任何 -Wshadow 警告。我知道我可以在 main.cpp 中添加编译指示警告推送和弹出,但这种方法仅适用于 Windows。是否可以在 CMake 中执行此操作,以便它适用于不同的平台,例如 linux 和 windows,并保持源代码干净?

最佳答案

I know I can add pragma warning push and pop in main.cpp but this approach will only work for windows.

GCC 有 diagnostic pragmas , MSVC warning pragmas 。只需检查编译器:MSVC 有 _MSC_VER,GCC 有 __GNUC__ 预定义。

Is there a way I can set different warning levels for different files in CMake?

set_source_files_properties允许您向特定源文件添加编译标志以覆盖以前的选项。


您只想隔离这些(写得不好的) header 的警告,而不是整个源文件的警告,因此对这些包含使用编译指示是更安全的方法。

关于c++ - 如何在CMake中为 native 代码和外部代码设置不同的编译器警告级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35715360/

相关文章:

c++ - WM_PASTE Hook 不工作

c++ - 如何实时使用事件同时按下多个键? (快板 5)

c++ - 如何在 Win32 中使用对话框资源?

php - php和C++能否在同一台服务器上运行并在一个网站中进行通信?

c++ - 为什么我在 C++ 中收到针对此基于范围的 for 循环的警告?

javascript - 如何在 Closure Compiler 中抑制 "WARNING - Redeclared variable:"

cmake - 将 compile_commands.json 复制到项目根文件夹

c++ - 使用 cmake 制作项目源目录的头文件后代

cmake - 如何将 "hook"转换为 Cmake 命令 add_executable 或 add_library 以运行额外的东西?

c++ - "C4649: attributes are ignored in this context"是什么意思?