c++ - 在 CMake 中将 C++11 程序链接到 Qt5 会导致错误

标签 c++ cmake qt5

我写了两个程序,每个程序都编译。但是,当我想将它们放在一起时,我会出错。我以为 Qt5 会支持 Cxx11,但我得到了错误。是因为我的发行版构建的 Qt5 没有 Cxx11 支持吗?!

CMAKE_MINIMUM_REQUIRED (VERSION 3.0)
PROJECT (SOMNetCPU)

FIND_PACKAGE(BZip2 REQUIRED)
FIND_PACKAGE(Qt5Widgets REQUIRED)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")

SET( ANGUISourceFiles
  QSOMReader.cpp
)

add_library (SOMReader ${ANGUISourceFiles})
TARGET_LINK_LIBRARIES (SOMReader Qt5::Widgets)

ADD_EXECUTABLE (SOMNetCPU SOMNetCPU.cpp)
TARGET_LINK_LIBRARIES (SOMNetCPU ANNet SOMReader) 

错误:

/usr/include/c++/5/bits/stl_tree.h:1018:7: error: expected identifier before string constant
       _GLIBCXX_ABI_TAG_CXX11
       ^
/usr/include/c++/5/bits/stl_tree.h:1018:7: error: expected ‘,’ or ‘...’ before string constant
/usr/include/c++/5/bits/stl_tree.h:1018:7: error: expected ‘;’ at end of member declaration
       _GLIBCXX_ABI_TAG_CXX11
       ^
/usr/include/c++/5/bits/stl_tree.h:1029:7: error: expected identifier before string constant
       _GLIBCXX_ABI_TAG_CXX11
       ^
/usr/include/c++/5/bits/stl_tree.h:1029:7: error: expected ‘,’ or ‘...’ before string constant
/usr/include/c++/5/bits/stl_tree.h:1029:7: error: expected ‘;’ at end of member declaration
       _GLIBCXX_ABI_TAG_CXX11
       ^
/usr/include/c++/5/bits/stl_tree.h:1029:7: error: ‘int std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::__abi_tag__(int)’ cannot be overloaded
       _GLIBCXX_ABI_TAG_CXX11
       ^
/usr/include/c++/5/bits/stl_tree.h:1018:7: error: with ‘int std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::__abi_tag__(int)’
       _GLIBCXX_ABI_TAG_CXX11
       ^
/usr/include/c++/5/bits/stl_tree.h:1053:7: error: expected identifier before string constant
       _GLIBCXX_ABI_TAG_CXX11
       ^
/usr/include/c++/5/bits/stl_tree.h:1053:7: error: expected ‘,’ or ‘...’ before string constant
/usr/include/c++/5/bits/stl_tree.h:1053:7: error: expected ‘;’ at end of member declaration
       _GLIBCXX_ABI_TAG_CXX11
       ^
/usr/include/c++/5/bits/stl_tree.h:1053:7: error: ‘int std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::__abi_tag__(int)’ cannot be overloaded
       _GLIBCXX_ABI_TAG_CXX11
       ^
/usr/include/c++/5/bits/stl_tree.h:1018:7: error: with ‘int std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::__abi_tag__(int)’
       _GLIBCXX_ABI_TAG_CXX11
       ^
/usr/include/c++/5/bits/stl_map.h:712:7: error: expected identifier before string constant
       _GLIBCXX_ABI_TAG_CXX11
       ^
/usr/include/c++/5/bits/stl_map.h:712:7: error: expected ‘,’ or ‘...’ before string constant
/usr/include/c++/5/bits/stl_map.h:712:7: error: expected ‘;’ at end of member declaration
       _GLIBCXX_ABI_TAG_CXX11
       ^
/usr/include/c++/5/bits/stl_multimap.h:618:7: error: expected identifier before string constant
       _GLIBCXX_ABI_TAG_CXX11
       ^
/usr/include/c++/5/bits/stl_multimap.h:618:7: error: expected ‘,’ or ‘...’ before string constant
/usr/include/c++/5/bits/stl_multimap.h:618:7: error: expected ‘;’ at end of member declaration
       _GLIBCXX_ABI_TAG_CXX11
       ^

最佳答案

Qt5 应该支持 C++11,除非它已明确构建并带有选项以将其关闭。很可能您要的是错误的 C++ 库。与其尝试显式指定编译器和链接器标志,这意味着您将承担更多的责任让事情正确,不如让 CMake 为您完成工作,看看是否能解决您的问题。如果您使用的是较新的 CMake 版本(3.2 或更高版本应该是安全的),请尝试将以下内容放在 CMakeLists.txt 文件的顶部附近,特别是在 project() 命令之前:

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

这将使 CMake 选择适当的编译器和链接器标志,它们将相互一致。在你的例子中,你只设置了一个编译器标志,所以链接器将选择默认的 C++ 库,这可能是也可能不是你想要的。将责任移交给 CMake 至少可以解决这个问题。仍然不能保证 CMake 会选择与构建 Qt 时使用的库相同的库,但你的机会非常大。您问题中的构建输出表明您的问题无论如何都在编译时,因此您的构建甚至还没有进入链接阶段。也就是说,我仍然认为以上内容可能会解决您的问题以及您以后可能会遇到的问题。

This article对上述 CMake 变量和相关 CMake 功能进行了更深入的讨论(免责声明:我写了这篇文章)。简而言之,他们将默认的 C++ 版本设置为 C++11,然后 CMake 将选择适合所使用的特定编译器和链接器的编译器和链接器标志。当在 CMakeLists.txt 文件中创建新目标时,这些变量将用作目标属性的默认值,这些属性确定应为哪个 C++ 版本构建目标。

关于c++ - 在 CMake 中将 C++11 程序链接到 Qt5 会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37439955/

相关文章:

c++ - 检测 QLineEdit 外部的点击

c++ - 如何正确地将 C 字符串传递给可变参数模板函数内的 lambda

c++ - 将目录添加到不带CMakeLists.txt的CMake项目中

c++ - CMake:默认情况下如何使 add_custom_command 输出保持最新?

android - 如何在 Android 上为 cmake 启用剥离

c++ - Qt qrc 资源文件 - 无法加载图标

c++ - 如何使用具有两列的模型获取 QComboBox 的当前值?

c++ - 如何创建具有预定义值和分配空间的字符串?

C++ 重载解析、转换运算符和 const

c++ - 类语法问题