2016-09-16 109 views
2

我一直在努力让服务器/客户端运行一个简单的单线程信使服务。它能够在Visual Studio上编译,但是当我尝试在Linux上通过makefile进行编译时,使用以下命令:make client,我得到一个非常大的错误列表。我会提供起始部,然后错误列表:使用G ++,未定义的引用std :: Makefile

这里它说,它至少尝试使用G ++:

g++ -g -c -o client.o client.cc cc client.o -o client client.o: In function main': /home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:10: undefined reference to std::allocator::allocator()'

EDIT: I noticed something unusual here. When I call make client again without calling make clean I get the following:

[email protected]:~/Desktop/CS360/Messaging_Service/messenger$ make client cc client.o -o client client.o: In function main': /home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:10: undefined reference to std::allocator::allocator()' Not sure if this is significant or not, but it doesn't mention g++ again.

片段说的错误:

/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:7: undefined reference to `std::allocator<char>::allocator()' 
/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:7: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)' 
/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:7: undefined reference to `std::allocator<char>::~allocator()' 
/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:15: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(char const*)' 
/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:18: undefined reference to `std::cout' 
/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:18: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' 
/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:18: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' 
/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:18: undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))' 
/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:23: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' 
/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:23: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()' 
/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:7: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()' 
/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:25: undefined reference to `std::allocator<char>::~allocator()' 
/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:25: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()' 
/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:7: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()' 
client.o: In function `Client::Client(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)': 
/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:27: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()' 
/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:27: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()' 
/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:29: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' 
/home/peter/Desktop/CS360/Messaging_Service/messenger/client.cc:32: undefined reference to `operator new[](unsigned long)' 

这导致我相信我的makefile存在错误。我使用g ++,我相信它也可以很好地编译,所以我不太确定从哪里开始。我的Makefile:

CXX= g++ $(CCFLAGS) 

MSG-SERVER= server.o 
MSG-CLIENT= client.o 
OBJS =  $(MSG-SERVER) $(MSG-CLIENT) 

LIBS = 

CCFLAGS = -g 

all: msg-server msg-client 

msg-server:$(MSG-SERVER) 
    $(CXX) -o server $(MSG-SERVER) $(LIBS) 

msg-client:$(MSG-CLIENT) 
    $(CXX) -o client $(MSG-CLIENT) $(LIBS) 

clean: 
    rm -f $(OBJS) $(OBJS:.o=.d) 

realclean: 
    rm -f $(OBJS) $(OBJS:.o=.d) server client 


# These lines ensure that dependencies are handled automatically. 
%.d: %.cc 
    $(SHELL) -ec '$(CC) -M $(CPPFLAGS) $< \ 
     | sed '\''s/\($*\)\.o[ :]*/\1.o [email protected] : /g'\'' > [email protected]; \ 
     [ -s [email protected] ] || rm -f [email protected]' 

include $(OBJS:.o=.d) 

如果需要,我会联系我的代码,以及:https://bitbucket.org/picklepetters/messenger/src/44e4fa12541948215f874b56e4ba0dedea1766f5/client.cc?at=master&fileviewer=file-view-default

当我做跟踪与make -d它给我的数据量巨大。我会后的被赋予什么样的一些片段,因为我真的不知道我在看:

Trying implicit prerequisite '/usr/include/c++/5/SCCS/s.stdexcept.F'. 
     Trying pattern rule with stem 'stdexcept'. 
     Trying implicit prerequisite '/usr/include/c++/5/stdexcept.r'. 
     Looking for a rule with intermediate file '/usr/include/c++/5/stdexcept.r'. 
     Avoiding implicit rule recursion. 
     Avoiding implicit rule recursion. 
     Avoiding implicit rule recursion. 
     Trying pattern rule with stem 'stdexcept'. 
     Rejecting impossible implicit prerequisite '/usr/include/c++/5/stdexcept.l'. 
     Trying pattern rule with stem 'stdexcept.r'. 
     Trying implicit prerequisite '/usr/include/c++/5/stdexcept.r,v'. 
     Trying pattern rule with stem 'stdexcept.r'. 
     Trying implicit prerequisite '/usr/include/c++/5/RCS/stdexcept.r,v'. 
     Trying pattern rule with stem 'stdexcept.r'. 
     Trying implicit prerequisite '/usr/include/c++/5/RCS/stdexcept.r'. 
     Trying pattern rule with stem 'stdexcept.r'. 
     Trying implicit prerequisite '/usr/include/c++/5/s.stdexcept.r'. 
     Trying pattern rule with stem 'stdexcept.r'. 
     Trying implicit prerequisite '/usr/include/c++/5/SCCS/s.stdexcept.r'. 
    Trying pattern rule with stem 'stdexcept'. 
    Rejecting impossible implicit prerequisite '/usr/include/c++/5/stdexcept.F'. 
    Trying pattern rule with stem 'stdexcept'. 
    Trying implicit prerequisite '/usr/include/c++/5/stdexcept.m'. 
    Looking for a rule with intermediate file '/usr/include/c++/5/stdexcept.m'. 
     Avoiding implicit rule recursion. 
     Avoiding implicit rule recursion. 
     Trying pattern rule with stem 'stdexcept'. 
     Trying implicit prerequisite '/usr/include/c++/5/stdexcept.ym'. 
     Trying pattern rule with stem 'stdexcept.m'. 
     Trying implicit prerequisite '/usr/include/c++/5/stdexcept.m,v'. 
     Trying pattern rule with stem 'stdexcept.m'. 
     Trying implicit prerequisite '/usr/include/c++/5/RCS/stdexcept.m,v'. 
     Trying pattern rule with stem 'stdexcept.m'. 
     Trying implicit prerequisite '/usr/include/c++/5/RCS/stdexcept.m'. 
     Trying pattern rule with stem 'stdexcept.m'. 

这就像直到也许150〜接近尾声线时,它说,它已经完成了先决条件

Finished prerequisites of target file 'server.d'. 
    Prerequisite 'server.cc' is older than target 'server.d'. 
    Prerequisite 'server.cc' is older than target 'server.d'. 
    Prerequisite '/usr/include/stdc-predef.h' is older than target 'server.d'. 
    Prerequisite 'server.h' is older than target 'server.d'. 
    Prerequisite '/usr/include/errno.h' is older than target 'server.d'. 
    Prerequisite '/usr/include/features.h' is older than target 'server.d'. 
    Prerequisite '/usr/include/x86_64-linux-gnu/sys/cdefs.h' is older than target 'server.d'. 
    Prerequisite '/usr/include/x86_64-linux-gnu/bits/wordsize.h' is older than target 'server.d'. 
    Prerequisite '/usr/include/x86_64-linux-gnu/gnu/stubs.h' is older than target 'server.d'. 
    Prerequisite '/usr/include/x86_64-linux-gnu/gnu/stubs-64.h' is older than target 'server.d'. 
    Prerequisite '/usr/include/x86_64-linux-gnu/bits/errno.h' is older than target 'server.d'. 

最后100行它指出:目标文件的

Must remake target 'server.o'. 
g++ -g -c -o server.o server.cc 
Putting child 0x13601a0 (server.o) PID 7768 on the chain. 
Live child 0x13601a0 (server.o) PID 7768 
server.cc: In function ‘int main(int, char**)’: 
server.cc:19:17: error: ‘cout’ was not declared in this scope 
       cout << "server [-p port]" << endl; 
       ^
server.cc:19:47: error: ‘endl’ was not declared in this scope 
       cout << "server [-p port]" << endl; 
              ^
server.cc: In constructor ‘Server::Server(int)’: 
server.cc:34:30: error: ‘>>’ should be ‘> >’ within a nested template argument list 
    map<string, vector<string>> mappedMessages; 
          ^
server.cc: At global scope: 
server.cc:121:36: error: ‘String’ has not been declared 
Server::handle_message(int client, String message) { 
            ^
server.cc:121:1: error: prototype for ‘void Server::handle_message(int, int)’ does not match any in class ‘Server’ 
Server::handle_message(int client, String message) { 
^ 
In file included from server.cc:1:0: 
server.h:33:12: error: candidate is: std::__cxx11::string Server::handle_message(int, std::__cxx11::string) 
    string handle_message(int, string); 
      ^
server.cc:127:35: error: ‘String’ has not been declared 
Server::parse_message(int client, String message) { 
           ^
server.cc:127:1: error: prototype for ‘std::__cxx11::string Server::parse_message(int, int)’ does not match any in class ‘Server’ 
Server::parse_message(int client, String message) { 
^ 
In file included from server.cc:1:0: 
server.h:34:12: error: candidate is: std::__cxx11::string Server::parse_message(int, std::__cxx11::string) 
    string parse_message(int, string); 
      ^
server.cc:190:63: error: ISO C++ forbids declaration of ‘store_message’ with no type [-fpermissive] 
Server::store_message(string name, string subject, string data) { 
                  ^
server.cc:190:1: error: prototype for ‘int Server::store_message(std::__cxx11::string, std::__cxx11::string, std::__cxx11::string)’ does not match any in class ‘Server’ 
Server::store_message(string name, string subject, string data) { 
^ 
In file included from server.cc:1:0: 
server.h:36:10: error: candidate is: void Server::store_message(std::__cxx11::string, std::__cxx11::string, std::__cxx11::string) 
    void store_message(string, string, string); 
     ^
server.cc: In member function ‘std::__cxx11::string Server::get_subjects(std::__cxx11::string)’: 
server.cc:210:5: error: ‘mappedMessages’ was not declared in this scope 
    if(mappedMessages.find(name) != mappedMessages.empty()) { 
    ^
server.cc:214:15: error: missing template arguments before ‘it’ 
    for(iterator it = mappedMessages.at(name).begin(); it != mappedMessages.at(name).end(); ++it) { 
      ^
server.cc:214:53: error: ‘it’ was not declared in this scope 
    for(iterator it = mappedMessages.at(name).begin(); it != mappedMessages.at(name).end(); ++it) { 
                ^
server.cc:214:59: error: ‘mappedMessages’ was not declared in this scope 
    for(iterator it = mappedMessages.at(name).begin(); it != mappedMessages.at(name).end(); ++it) { 
                 ^
server.cc:219:29: error: no match for ‘operator+’ (operand types are ‘std::__cxx11::basic_string<char>’ and ‘int’) 
    response = response + " " + counter + " " + mappedMessages.at(name).it.front() + "\n"; 
+1

你能告诉我们你的makefile执行的全部痕迹?我怀疑有一些C编译涉及到了...... –

+1

好的,我只是把它放到原来的文章中,如果那是你的意思,那么我输入文件路径来执行makefile – Petorix

+1

我的意思是:trace 'make'执行,请在问题中。 –

回答

1

这里的问题是使用

make client 

代替

make msg-client 

由于没有对客户端没有目标,使默认使用CC。这在原始问题的第一个黄色框中显示。

1

那些undefined reference to 'std::allocator<char>::allocator()'错误通常意味着libstdc++则没有链接,最常因为人们连接gcc而不是g++

依赖关系生成规则使用$(CC)而不是$(CXX),这是导致这些编译器错误的原因。事实上,这条规则现在已经十年没有必要了。你应该做的是以下几点:

  1. 完全删除%.d规则及其配方。
  2. 直接编译器在编译.cc.o(您的makefile文件使用the built-in rule %.o : %.cc)时产生依赖(-MD -MP):

    %.o : %.cc 
        $(CXX) -c -o [email protected] -MD -MP ${CPPFLAGS} ${CXXFLAGS} $< 
    
  3. 变化include $(OBJS:.o=.d)-include $(OBJS:.o=.d)

生成和使用依赖关系不需要其他任何东西。有关更多详细信息,请参阅https://stackoverflow.com/a/32379965/412080

+1

我明白,如果你看看Makefile,它使用g ++而不是gcc。它没有得到g ++的部分,只是默认gcc? – Petorix

+1

@Petorix更新了答案。 –

+1

原来我犯了一个错误,就是把这个makefile与另一个我正在编码的程序混淆了。结果我输入了一个不同的make命令,所以它找到了最接近的替代方法,并恢复为gcc。令人惊讶的是另一组眼睛可以做什么。不过,我会尽快答复您的答案,很高兴知道我使用的是过时的方法。 – Petorix

0

中添加针对G你的命令行++选项[-std = C++ 11]