2015-06-15 76 views
3

我想在Ubuntu上使用GCC 5.1編譯使用C++ 11功能編寫的庫。但是,它抱怨std::unique_ptr未定義。使用GCC 5.1工具鏈無法編譯C++ 11源碼

gcc (Ubuntu 5.1.0-0ubuntu11~14.04.1) 5.1.0 
g++ (Ubuntu 5.1.0-0ubuntu11~14.04.1) 5.1.0 

CXX標誌:

-std=c++11 -Wall -Wextra -Weffc++ -pedantic 

輸出:

error: ‘unique_ptr’ in namespace ‘std’ does not name a template type 
     std::unique_ptr<detail::RegexImpl> m_pimpl; 

不過,我能夠編譯OSX上完全相同的代碼。

Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) 

CXX標誌:

-stdlib=libc++ -std=c++11 -Wall -Wextra -Weffc++ -pedantic 

我在做什麼錯?

+4

請顯示出處。你包括''? –

+0

我在Ubuntu上對gcc 5.1沒有任何問題。我從源代碼編譯它,添加包含和lib路徑env變量,它的工作原理。 – bolov

+2

這聽起來像你依賴於實現依賴的頭間依賴關係。當您嘗試移植不可移植的代碼時不會感到意外,幸運的是修復很容易。 –

回答

11

你沒有做錯任何事情。圖書館的來源缺少#include <memory>

這只是圖書館作者的一個不幸的錯誤。對於人員to rely on certain standard headers just so happening to include other standard headers on their particular implementation而言,如果不檢查他們是否正在使用他們應該使用的所有#include聲明,這是非常常見的。

你現在可以破解#include,但是從長遠來看,如果項目接受補丁,你應該向圖書館作者提出一個錯誤,甚至可能貢獻一個補丁。

+0

是否有已知的編譯器使用必要的最小內含物?或者是該圖書館維護者的最佳策略,以確保它使用多個C++編譯器來發現像這樣的錯誤? –

+0

@BrianCain:我不太清楚如何回答這個問題,說實話。我個人的策略是_diligence_:每當我寫一個標準庫名稱,我不知道我已經在同一個翻譯單元中使用過,我查找它來自哪個頭文件,然後添加相關的'#include '如果它不在那裏。如果你保持這一點,不會真的出問題,儘管它在一段時間後會變得乏味。 –

+0

知道了!將提交補丁給作者 – Thijs