簡體   English   中英

將C ++ 11程序鏈接到CMake中的Qt5會導致錯誤

[英]Linking C++11 program to Qt5 in CMake leads to error

我寫了兩個程序,每個都編譯。 但是,當我想將它們組合在一起時,會出錯。 我以為Qt5將支持Cxx11,但出現錯誤。 是因為我的發行版是在沒有Cxx11支持的情況下構建Qt5嗎?

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時所使用的庫相同的庫,但是您的機會很大。 您問題中的構建輸出表明您的問題仍然在編譯時,因此您的構建甚至還沒有進入鏈接階段。 也就是說,我仍然認為以上內容可能會解決您的問題,並且可能會解決您以后遇到的問題。

本文對上述CMake變量和相關的CMake功能進行了更深入的討論(免責聲明:我寫了這篇文章)。 簡而言之,他們將默認C ++版本設置為C ++ 11,然后CMake將選擇適合於所使用的特定編譯器和鏈接器的編譯器和鏈接器標志。 在CMakeLists.txt文件中創建新目標時,這些變量將用作目標屬性的默認值,這些屬性確定應為目標構建哪個C ++版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM