如何在CMake中为本机代码和外部代码设置不同的编译器警告级别

时间:2016-03-01 05:31:16

标签: 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 out,但这也意味着任何-Wshadow警告都不会被我的本机代码捕获。我知道我可以在main.cpp中添加pragma警告push和pop,但这种方法只适用于windows。是否可以在CMake中实现它,以便它适用于不同的平台,如linux和windows,并保持源代码清洁?

2 个答案:

答案 0 :(得分:2)

  

我知道我可以在main.cpp中添加pragma警告push和pop但是这个   方法只适用于Windows。

海湾合作委员会有diagnostic pragmas,MSVC warning pragmas。只需检查编译器:MSVC有 _MSC_VER ,GCC预定义为 __ GNUC __

  

有没有办法可以为不同的文件设置不同的警告级别   在CMake?

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

您只想隔离这些(写得不好的)标题的警告,而不是整个源文件的警告,因此使用pragma进行这些包含是更安全的方式。

答案 1 :(得分:1)

不,你不能就此问题与CMake做任何事情。您只能依赖于某些与编译器相关的侵入式方法,例如push/pop编译指示警告。您似乎已经知道如何使用MSVC,here是如何使用GCC的链接。

但是为什么你不能在不修改标题的情况下使用CMake做到这一点?由于标头不是独立文件,因此它们会嵌入到cpp文件中,然后才会处理它们。所以应该设置的是整个单元,而不是标题。一般而言,您不知道哪些单位包含哪些标题。因此,即使您使用的编译器支持每个文件警告级别,它也太脆弱而无法尝试使用此功能:标题可能会被其他任何对您的策略一无所知的程序员包含在任何其他单元中 - 它过分依赖于人是坏人。

更容易创建TurnOffWarnings/TurnOnWarnings头文件并强制组织中的策略用这些自定义标头之间的尖括号包装所有包含。