2016-09-16 7 views
2

私はシンプルなシングルスレッドメッセンジャーサービスのためにサーバ/クライアントを動かすことに取り組んできました。 Visual Studioでコンパイルすることはできますが、メイクファイルを使用してLinux上でコンパイルしようとすると、コマンド:make clientを使用すると、非常に大きなエラーリストが表示されます。私は冒頭部分、その後、エラーのリストを提供します:G ++を使用して、未定義のリファレンスstd :: Makefile

をここでは、少なくとも++グラムを使用しようとしていることを述べている:言わエラーの

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)' 

この私のメイクファイルに誤りがあると私に信じさせる。私は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〜ラインまで、そのようなものだ:私は正直に私が見ていても何のアイデアを持っていないので、私は、与えられたもののいくつかのスニペットを投稿しますそれは述べて最後の100行のための

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'. 

:ターゲットファイルの

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

あなたのメイクファイル実行の完全なトレースを表示できますか?私はいくつかのCコンパイルが関係していると思っています... –

+1

元の投稿に入れました。それが完全なトレースの意味だったら、メイクファイル実行のファイルパスに入力しました。 – Petorix

+1

つまり、トレース'make'実行の中で、質問にしてください。 –

答えて

1

問題ここでは、代わりに

make msg-client 

make client 

を使用している、CCを使用してデフォルトを作ります。これは最初の質問の最初の黄色のボックスに表示されます。

1

ものundefined reference to 'std::allocator<char>::allocator()'エラーは通常、libstdc++が最も多く、中にリンクされていないことを意味します人々はg++の代わりにgccとリンクしているためです。

依存関係生成規則で$(CXX)の代わりに$(CC)を使用すると、コンパイラエラーが発生します。実際、このルールは10年後には不要でした。あなたがすべきことは次のとおりです:

  1. その%.dルールとそのレシピを完全に削除します。

    %.o : %.cc 
        $(CXX) -c -o [email protected] -MD -MP ${CPPFLAGS} ${CXXFLAGS} $< 
    
  2. 変更-include $(OBJS:.o=.d)からinclude $(OBJS:.o=.d):(あなたのメイクファイルがthe built-in rule %.o : %.ccを使用しています).cc.oにコンパイルするときの依存関係(-MD -MP)を生成するコンパイラ
  3. 直接。

他に依存関係を生成して使用する必要はありません。詳細はhttps://stackoverflow.com/a/32379965/412080を参照してください。クライアントのためのターゲットが存在しないため

+1

私はそれを理解していて、Makefileを見るとgccではなくg ++を使います。 g ++の部分がなく、gccをデフォルトにしていますか? – Petorix

+1

@Petorix答えを更新しました。 –

+1

私はこのメイクファイルを私がコーディングしていたものと混同している間違いをしていました。その結果、私は別のmakeコマンドを入力していたので、最も近い選択肢を見つけてgccに戻しました。別の目でできることを驚かせます。私はあなたの答えをupvote、それは古いメソッドを使用していた知って良いです。 – Petorix

0

あなたのコマンドラインでg ++のオプションを追加してください。

関連する問題