2016-09-16 107 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]