【问题标题】:CMake: C++11 not set with CXX_STANDARDCMake:C++11 未使用 CXX_STANDARD 设置
【发布时间】:2015-09-02 09:27:38
【问题描述】:

我想用 C++11 编译一个库。该库是一个子项目。 在其 CMakeLists.txt 中,我使用 CXX_STANDARDCXX_STANDARD_REQUIRED 设置了 C++11 功能,如 here 所示。

它执行的 cmake 命令没有错误,但是当我开始编译时,我收到与缺少 C++11 功能相关的错误,例如

In file included from /folder/OptionWidget.cpp:1:0:
/folder/OptionWidget.h:14:28: warning: defaulted and deleted functions only available with -std=c++0x or -std=gnu++0x [enabled by default]
/folder/OptionWidget.h:14:28: error: ‘virtual WTradeGui::OptionWidget::~OptionWidget()’ declared virtual cannot be defaulted in the class body
make[2]: *** [.../OptionWidget.cpp.o] Error 1

错误在于我在标头 virtual ~OptionWidget() = default; 中声明了默认的虚拟析构函数

如果我执行命令make VERBOSE=1我可以看到编译命令中没有设置C++11标志:

 /usr/bin/c++   -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_WIDGETS_LIB -I/folder/wtradegui -I/folder/wtradegui -I/folder/wtrade/src -isystem /qt/include -isystem /qt/QtWidgets -isystem /qt/QtGui -isystem /qt/QtCore -isystem -fPIC -o CMakeFiles/wtradegui.dir/OptionWidget.cpp.o -c /folder/OptionWidget.cpp

我使用 Ubuntu 15.04,cmake 版本 3.3.1 和 gcc 版本 4.6.3。

在 windows 下使用 MinGW 构建相同的项目没有问题(抱歉我不记得版本,它是 Qt 5.5.0 版本附带的版本)。

为了在 Linux 中构建项目,我必须做什么?

这是主要的 CMakeList.txt

# In order to work following variables must be set
#
# QT_DIR: Path to Qt installation.

cmake_minimum_required (VERSION 3.1.0)

# Variables that should be set before execution
if (WIN32)
    set (QT_DIR "" CACHE PATH "Qt library path")
else (WIN32)
    set (QT_DIR "/usr/include" CACHE PATH "Qt library path")
endif (WIN32)

message ("Generating WPlot project")
message ("Setting QT_DIR To ${QT_DIR}")

add_subdirectory (wplot)
add_subdirectory (demo)

这是 wplot 文件夹中的 CMakeLists.txt

# wPlot project

cmake_minimum_required (VERSION 3.1.0)

project (wplot)

set (major_version 0)
set (minor_version 0)
set (bugfix_version 1)
set (project_version ${major_version}.${minor_version}.${bugfix_version})
set (OUTPUT_DIR "build")
set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/export/lib)
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/export/lib)
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/export/bin)
set (INCLUDE_EXPORT_DIRECTORY ${CMAKE_BINARY_DIR}/export/include/wplot)
set (CMAKE_DOC_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/export/doc)
set (CMAKE_PREFIX_PATH ${QT_DIR}/lib/cmake)
set (CMAKE_AUTOMOC ON)
set (CMAKE_INCLUDE_CURRENT_DIR ON)

message ("=== Generating WPlot ===")
message ("Setting QT_DIR To ${QT_DIR}")
message ("CMAKE_PREFIX_PATH set to ${CMAKE_PREFIX_PATH}")
find_package (Qt5Widgets REQUIRED)
include_directories (${CMAKE_SOURCE_DIR} ${Qt5Widgets_INCLUDE_DIRS})
file (GLOB_RECURSE WPLOT_SOURCES "*.cpp")
file (GLOB WPLOT_PUBLIC_HEADERS "*.h")
file (COPY ${WPLOT_PUBLIC_HEADERS} DESTINATION ${INCLUDE_EXPORT_DIRECTORY})

# Compile project
add_definitions(-DWPLOT_LIBRARY)
add_library (wplot SHARED ${WPLOT_SOURCES})
target_link_libraries(wplot ${Qt5Widgets_LIBRARIES})
set_target_properties(
  wplot
  PROPERTIES
    VERSION ${project_version}
    SOVERSION ${project_version}
)
set_property(TARGET wplot PROPERTY CXX_STANDARD 11)
set_property(TARGET wplot PROPERTY CXX_STANDARD_REQUIRED ON)

【问题讨论】:

    标签: linux c++11 cmake


    【解决方案1】:

    GCC 对 C++11 的支持有 progressively grown since GCC 4.3 to GCC 4.9

    GCC 4.6 正式支持 C++0x 的一个子集(C++11 草案标准的名称在它还没有名字之前)。 Qt 5.5 附带 MinGW 4.9,它基本上完全支持 C++11。

    CMake 不认为 GCC 4.6 支持 C++11 似乎是合理的,但我不确定为什么 CXX_STANDARD_REQUIRED=ON 不会强制配置步骤失败。无论如何,更好的方法是使用 target_compile_features 命令告诉 CMake 您需要哪些 C++11 功能,并让它确定启用这些功能所需的编译器标志。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      相关资源
      最近更新 更多