通过cmake禁用特定库的警告

时间:2015-05-20 03:18:21

标签: c++ qt boost cmake

我正在使用boost,Qt和其他库来开发一些应用程序并使用cmake作为我的make工具。为了消除先前的问题,我决定打开最强的警告标志(感谢mloskot

if(MSVC)
  # Force to always compile with W4
  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 OR
"${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  # Update if necessary
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic")
endif()

到目前为止一切顺利,但这会引发很多关于我正在使用的库的警告,是否可以通过cmake禁用特定文件夹,文件或库的警告?

编辑: 我在谈论第三方库的用法。例子是

G:\qt5\T-i386-ntvc\include\QtCore/qhash.h(81) : warning C4127: conditional expression is constant

G:\qt5\T-i386-ntvc\include\QtCore/qlist.h(521) : warning C4127: conditional expression is constant
        G:\qt5\T-i386-ntvc\include\QtCore/qlist.h(511) : while compiling class template member function 'void QList<T>::append(const T &)'
        with
        [
            T=QString
        ]
        G:\qt5\T-i386-ntvc\include\QtCore/qstringlist.h(62) : see reference to class template instantiation 'QList<T>' being compiled
        with
        [
            T=QString
        ]

等等

1 个答案:

答案 0 :(得分:3)

CMake无法做到这一点,因为MSVC无法做到这一点。但您可以使用pragma指令在源代码中禁用警告。您需要确定它们来自哪个标头,警告编号并仅禁用该标头的警告。例如:

#ifdef _MSC_VER
#pragma warning(disable: 4345) // disable warning 4345
#endif
#include <boost/variant.hpp>
#ifdef _MSC_VER
#pragma warning(default: 4345) // enable warning 4345 back
#endif