2017-10-24 6 views
1

CMakeプロジェクトを生成できますが、構築できません。CMAKEを使用してメイクファイルを生成した後の未定義参照

├── bin                                                          
├── build                                                          
├── CMakeLists.txt                                                        
├── include                                                         
│   └── project                                                        
│    ├── base_socket.h                                                      
│    ├── tcp_client.h                                                      
│    ├── tcp_server.h                                                      
│    ├── udp_client.h                                                      
│    └── udp_server.h                                                      
├── LICENSE.txt                                                        
├── README.md                                                         
└── src                                                          
    └── project                                                        
     ├── base_socket.cpp                                                     
     ├── CMakeLists.txt                                                      
     ├── main.cpp                                                       
     ├── tcp_client.cpp                                                      
     ├── tcp_server.cpp                                                      
     ├── udp_client.cpp                                                      
     └── udp_server.cpp 

、トップディレクトリではかなりまっすぐ進むCMakeLists.txtファイル:

# Project initialization                                                      
cmake_minimum_required(VERSION 2.7.2 FATAL_ERROR)                                                

project("cpp_sockets")                                                                                                                                                                            

# Add include directory                                                      
include_directories(include)                                                     

# Add subdirectories                                                       
add_subdirectory(src/project)                                                     

src/project/CmakeLists.txtでかなり単純な1:

私はかなり簡単なプロジェクト構造を持っている

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)                                             
set(HEADER_DIR ${CMAKE_SOURCE_DIR}/include/project)                                               
set(HEADER_FILES                                                        
    ${HEADER_DIR}/base_socket.h                                                     
    ${HEADER_DIR}/tcp_client.h                                                     
    ${HEADER_DIR}/tcp_server.h                                                     
    ${HEADER_DIR}/udp_client.h                                                     
    ${HEADER_DIR}/udp_server.h                                                     
)       

add_executable(cpp_sockets main.cpp ${HEADER_FILES}) 

cd/buildに入力してcmake ..と入力すると正常に動作します。

しかし、私はmakeとそれに従うと、私はundefined referenceについて多くのひどい誤りを得る。

main.cpp:(.text+0x2c6): undefined reference to `UDPClient::UDPClient(int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'                    
main.cpp:(.text+0x2eb): undefined reference to `UDPClient::send_message(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'                    
main.cpp:(.text+0x359): undefined reference to `UDPServer::UDPServer(int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'                    
main.cpp:(.text+0x380): undefined reference to `UDPServer::socket_bind()'                                          
main.cpp:(.text+0x38c): undefined reference to `UDPServer::listen()'                                           
main.cpp:(.text+0x400): undefined reference to `TCPClient::TCPClient(int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'                    
main.cpp:(.text+0x40c): undefined reference to `TCPClient::make_connection()'                                         
main.cpp:(.text+0x42b): undefined reference to `TCPClient::send_message(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'                    
main.cpp:(.text+0x492): undefined reference to `TCPServer::TCPServer(int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'                    
main.cpp:(.text+0x4b9): undefined reference to `TCPServer::socket_bind()'                                          
CMakeFiles/cpp_sockets.dir/main.cpp.o: In function `UDPClient::~UDPClient()':                                         
main.cpp:(.text._ZN9UDPClientD2Ev[_ZN9UDPClientD5Ev]+0x14): undefined reference to `Socket::~Socket()'                                   
CMakeFiles/cpp_sockets.dir/main.cpp.o: In function `UDPServer::~UDPServer()':                                         
main.cpp:(.text._ZN9UDPServerD2Ev[_ZN9UDPServerD5Ev]+0x14): undefined reference to `Socket::~Socket()'                                   
CMakeFiles/cpp_sockets.dir/main.cpp.o: In function `TCPClient::~TCPClient()':                                         
main.cpp:(.text._ZN9TCPClientD2Ev[_ZN9TCPClientD5Ev]+0x14): undefined reference to `Socket::~Socket()'                                   
CMakeFiles/cpp_sockets.dir/main.cpp.o: In function `TCPServer::~TCPServer()':                                         
main.cpp:(.text._ZN9TCPServerD2Ev[_ZN9TCPServerD5Ev]+0x14): undefined reference to `Socket::~Socket()'                                   
collect2: error: ld returned 1 exit status                                                  
src/project/CMakeFiles/cpp_sockets.dir/build.make:94: recipe for target '../bin/cpp_sockets' failed                                   
make[2]: *** [../bin/cpp_sockets] Error 1                                                  
CMakeFiles/Makefile2:85: recipe for target 'src/project/CMakeFiles/cpp_sockets.dir/all' failed                                     
make[1]: *** [src/project/CMakeFiles/cpp_sockets.dir/all] Error 2                                            
Makefile:83: recipe for target 'all' failed                                                 
make: *** [all] Error 2 

main.cppファイルは次のようになります。

#include "project/udp_server.h"                                                    
    #include "project/udp_client.h"                                                    
    #include "project/tcp_client.h"  

なぜリンカは、このような参照を見つけることができないでしょうか?

+0

が見えます、実行可能ファイルを作成するときにこれらのファイルを追加することは忘れてしまいます。 (インクルードするヘッダファイルは、関数の*宣言*のみを提供します)。 'add_executable'の – Tsyvarev

+1

は、ヘッダではなく、すべての実装ファイル(* .cpp)をリストします。ヘッダーの場合、 'include_directories'を指定してください。 –

+0

ありがとうございます@PiotrSkotnicki。それは答えかもしれない! – Startec

答えて

1

それは実行可能cpp_socketsの依存関係として、udp_server.cppudp_client.cppのように、他のcppファイルを指定するために、あなたのsrc/project/CMakeLists.txt怠るように見えます。 CMakeがそれらのソースファイルをコンパイルするためにこれを行う必要があります。対応するヘッダーをインクルードしているため、コンパイルを自動的に実行することはありません。実際には、add_executable宣言は、include_directoriesコマンドがそれを処理するため、ヘッダーについて何も言及する必要はありません。

あなたmain.cppが依存するヘッダファイルを考えると、そのadd_executable行は次のようになります。あなたは** `udp_client.cpp`ソースファイルなどに**定義関数を与えているよう

add_executable(cpp_sockets main.cpp udp_server.cpp udp_client.cpp tcp_client.cpp) 
関連する問題