从远程主机

时间:2017-04-27 19:54:00

标签: c++ ubuntu makefile std

我尝试使用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

非常感谢!

2 个答案:

答案 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编译器选项。