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