2015-06-15 45 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