我尝试使用Putty在家用计算机上运行Ubuntu的服务器上编译C ++ 11代码。我使用makefile编译并在代码中包含共享指针,但它给了我这个错误:
/usr/include/c++/4.8/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
但是,当我尝试从托管文件的服务器编译代码时(当我在大学时),它编译得很完美。这是我的makefile:
all: huffmandriver.o huffmannode.o huffmantree.o
g++ -o huffencode huffmandriver.o huffmannode.o huffmantree.o -std=c++11
huffmannode.o: huffmannode.cpp huffmannode.h
g++ -c huffmannode.cpp -std=c++11
huffmantree.o: huffmantree.cpp huffmantree.h
g++ -c huffmantree.cpp -std=c++11
clean:
@rm -f *.o
@rm -f huffencode
我也尝试添加标记-stdlib=libc++ -std=gnu++
,但这也不起作用。以下是抛出错误的代码片段:
// Huffman Node class header
#ifndef HUFFMANNODE_H
#define HUFFMANNODE_H
#include <memory>
#include <string>
namespace YNGMAT005 {
class HuffmanNode {
private:
std::shared_ptr<HuffmanNode> left;
std::shared_ptr<HuffmanNode> right;
std::shared_ptr<HuffmanNode> parent;
std::string letter;
int frequency;
public:
HuffmanNode(std::string l, int freq);
~HuffmanNode();
std::shared_ptr<HuffmanNode> & get_left();
std::shared_ptr<HuffmanNode> & get_right();
std::shared_ptr<HuffmanNode> & get_parent();
void set_left(std::shared_ptr<HuffmanNode> & l);
void set_right(std::shared_ptr<HuffmanNode> & r);
bool has_left();
bool has_right();
void set_parent(std::shared_ptr<HuffmanNode> & p);
bool has_parent();
std::string get_letter();
int get_frequency();
};
}
#endif
非常感谢!
答案 0 :(得分:2)
我不知道为什么你会从不同的登录环境中看到不同的行为(在两者上检查which g++; g++ --version
并查看你的.profile
,.bash_profile
或.bashrc
基于ssh-vs-local登录做任何奇怪的事情。)
尽管如此,您应该能够通过将-std=c++11
提供给.cpp到.o的默认规则来使其在两种设置中都能正常工作:
CXXFLAGS = -std=c++11
此外,(从Daniel的回答中无耻地窃取)你可以删除其他.cpp文件的显式规则,只留下.h依赖项:
huffmannode.o: huffmannode.h
huffmantree.o: huffmantree.h
然后这些将自动获取CXXFLAGS设置。
答案 1 :(得分:2)
您可能还需要使用huffmandriver.cpp
编译-std=c++11
。目前,您有使用huffmannode.cpp
编译器选项编译huffmantree.cpp
和-std=c++11
的规则,但不包括huffmandriver.cpp
。
您可以创建自定义pattern rule,以便从.o
文件制作.cpp
文件并指定标头依赖关系,如下所示:
huffmannode.o: huffmannode.h
huffmantree.o: huffmantree.h
%.o: %.cpp
g++ -std=c++11 -c -march=native -o $@ $<
另一种方法是将CXXFLAGS
implicit variable定义为-std=c++11
。这样,用于编译C ++源文件的built-in rule'$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c
'将使用-std=c++11
编译器选项。