2016-12-20 31 views
5

zeromqライブラリを使用して別のC++プロジェクトで使用する方法を学び始めました。 (実際にそこにチュートリアルからコピーされた)、私が書いたサンプルコードは、このです:ファイルがで生成されますcmakeでzeromqライブラリをインポートするには?

g++ main.cpp -o test -lzmq 

// file: main.cpp 
// Hello World client in C++ 
// Connects REQ socket to tcp://localhost:5555 
// Sends "Hello" to server, expects "World" back 
// 
#include <zmq.hpp> 
#include <string> 
#include <iostream> 

int main() 
{ 
    // Prepare our context and socket 
    zmq::context_t context (1); 
    zmq::socket_t socket (context, ZMQ_REQ); 

    std::cout << "Connecting to hello world server…" << std::endl; 
    socket.connect ("tcp://localhost:5555"); 

    // Do 10 requests, waiting each time for a response 
    for (int request_nbr = 0; request_nbr != 10; request_nbr++) { 
     zmq::message_t request (5); 
     memcpy (request.data(), "Hello", 5); 
     std::cout << "Sending Hello " << request_nbr << "…" << std::endl; 
     socket.send (request); 

     // Get the reply. 
     zmq::message_t reply; 
     socket.recv (&reply); 
     std::cout << "Received World " << request_nbr << std::endl; 
    } 
    return 0; 
} 

と以下のコマンドを使用して、このファイルの出力を構築することにより

問題ない。

私が持っている問題は、私は以下のようにCMakeLists.txtファイルを書いて、私はCMake.Thusを使用してファイルを構築したいということです。

cmake_minimum_required(VERSION 3.6) 
project(test2) 


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -lzmq") 


set(SOURCE_FILES main.cpp) 
add_executable(test2 ${SOURCE_FILES}) 

思った部分は構築するのに十分だろうプログラムは-lzmqですが、その部分が含まれさえして、私は次のエラーメッセージが出ます:

CMakeFiles/test2.dir/main.cpp.o: In function `zmq::error_t::error_t()': 
/usr/include/zmq.hpp:62: undefined reference to `zmq_errno' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::error_t::what() const': 
/usr/include/zmq.hpp:66: undefined reference to `zmq_strerror' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::message_t::message_t()': 
/usr/include/zmq.hpp:107: undefined reference to `zmq_msg_init' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::message_t::message_t(unsigned long)': 
/usr/include/zmq.hpp:114: undefined reference to `zmq_msg_init_size' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::message_t::~message_t()': 
/usr/include/zmq.hpp:129: undefined reference to `zmq_msg_close' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::message_t::data()': 
/usr/include/zmq.hpp:180: undefined reference to `zmq_msg_data' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::context_t::context_t(int)': 
/usr/include/zmq.hpp:204: undefined reference to `zmq_init' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::context_t::~context_t()': 
/usr/include/zmq.hpp:225: undefined reference to `zmq_term' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::socket_t::socket_t(zmq::context_t&, int)': 
/usr/include/zmq.hpp:251: undefined reference to `zmq_socket' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::socket_t::close()': 
/usr/include/zmq.hpp:283: undefined reference to `zmq_close' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::socket_t::connect(char const*)': 
/usr/include/zmq.hpp:314: undefined reference to `zmq_connect' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::socket_t::send(zmq::message_t&, int)': 
/usr/include/zmq.hpp:321: undefined reference to `zmq_send' 
/usr/include/zmq.hpp:324: undefined reference to `zmq_errno' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::socket_t::recv(zmq::message_t*, int)': 
/usr/include/zmq.hpp:331: undefined reference to `zmq_recv' 
/usr/include/zmq.hpp:334: undefined reference to `zmq_errno' 

私はcmakeのファイル内の変数の別の種類を設定したり、私が間違ったディレクトリにライブラリをインストールしている必要がありますか?または私が言及すべきである何か他にありますか? 私が取り組んでいるシステムの魔女はUbuntuです。14.04

答えて

12

CMakeは0mqの直接サポートを含まず、0mqはCMakeを直接サポートしていません。しかし、0mqはpkg-configをサポートしています。あなたがUbuntu 14.04を使用していると述べたので、0mqのライブラリ、ヘッダー、およびpkg-config.pcファイルをインストールするにはsudo apt-get install libzmq3-devを実行してください。

次に、上記のバージョンから変更したCMakeLists.txtを使用してください。 (私は、インラインすべての私の変更をコメントしました。)

## i have cmake 3.5 
cmake_minimum_required(VERSION 3.5) 
project(test2) 

## use this to globally use C++11 with in our project 
set(CMAKE_CXX_STANDARD 11) 

## load in pkg-config support 
find_package(PkgConfig) 
## use pkg-config to get hints for 0mq locations 
pkg_check_modules(PC_ZeroMQ QUIET zmq) 

## use the hint from above to find where 'zmq.hpp' is located 
find_path(ZeroMQ_INCLUDE_DIR 
     NAMES zmq.hpp 
     PATHS ${PC_ZeroMQ_INCLUDE_DIRS} 
     ) 

## use the hint from about to find the location of libzmq 
find_library(ZeroMQ_LIBRARY 
     NAMES zmq 
     PATHS ${PC_ZeroMQ_LIBRARY_DIRS} 
     ) 

set(SOURCE_FILES main.cpp) 
add_executable(test2 ${SOURCE_FILES}) 

## add the include directory to our compile directives 
target_include_directories(test2 PUBLIC ${ZeroMQ_INCLUDE_DIR}) 
## at the 0mq library to our link directive 
target_link_libraries(test2 PUBLIC ${ZeroMQ_LIBRARY}) 

今、あなたはあなたのプロジェクトをmakeすることができます。

❯ make 
[ 50%] Building CXX object CMakeFiles/test2.dir/main.cpp.o 
[100%] Linking CXX executable test2 
[100%] Built target test2 

ボンネットの内部で何が起こっているのかを確認するには、冗長なものを作成します。

❯ make VERBOSE=1 
/usr/bin/cmake -H/home/nega/foo -B/home/nega/foo/build --check-build-system CMakeFiles/Makefile.cmake 0 
/usr/bin/cmake -E cmake_progress_start /home/nega/foo/build/CMakeFiles /home/nega/foo/build/CMakeFiles/progress.marks 
make -f CMakeFiles/Makefile2 all 
make[1]: Entering directory '/home/nega/foo/build' 
make -f CMakeFiles/test2.dir/build.make CMakeFiles/test2.dir/depend 
make[2]: Entering directory '/home/nega/foo/build' 
cd /home/nega/foo/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/nega/foo /home/nega/foo /home/nega/foo/build /home/nega/foo/build /home/nega/foo/build/CMakeFiles/test2.dir/DependInfo.cmake --color= 
make[2]: Leaving directory '/home/nega/foo/build' 
make -f CMakeFiles/test2.dir/build.make CMakeFiles/test2.dir/build 
make[2]: Entering directory '/home/nega/foo/build' 
[ 50%] Building CXX object CMakeFiles/test2.dir/main.cpp.o 
/usr/bin/c++  -std=gnu++11 -o CMakeFiles/test2.dir/main.cpp.o -c /home/nega/foo/main.cpp 
[100%] Linking CXX executable test2 
/usr/bin/cmake -E cmake_link_script CMakeFiles/test2.dir/link.txt --verbose=1 
/usr/bin/c++  CMakeFiles/test2.dir/main.cpp.o -o test2 /usr/lib/x86_64-linux-gnu/libzmq.so 
make[2]: Leaving directory '/home/nega/foo/build' 
[100%] Built target test2 
make[1]: Leaving directory '/home/nega/foo/build' 
/usr/bin/cmake -E cmake_progress_start /home/nega/foo/build/CMakeFiles 0 

あなたがコンパイル行を見れば、あなたは何-I/path/to/zmqフラグはありません

  1. C++ 11のサポートは、(-std=gnu++11フラグ付き)を添加した
  2. ことに気づくでしょう。 Ubuntuは/usr/includeにしてzmq.hppをダンプし、CMakeのは、それがデフォルトのパスを知っているのに十分スマートだからですので、それはあなたがリンク行を見れば、あなたはそのlibzmq.soに気付くでしょう

が含まれているものにしません完全な経路を介して一部の人々はそれを好きではなく(自分自身を含む)、代わりに-L/lib/dir -lmylibを好む。完全なパスを使うことは "the CMake way"です。実際には、CMakeを使って成長し、大きくて複雑なプロジェクトに使うと感謝しています。)

あなたはUbuntuを利用しているので、dpkg -L libzmq3-devを使って興味のあるファイルの場所を見つけて元のCMAKE_CXX_FLAGS行に追加したことに注意してください。しかし、それは不正行為であり、ポータブルではありません。

+0

私は、 'sudo apt install libzmq5' [Ubuntu]または' brew install zmq' [OS X] –

3

cmake設定ファイルがlibzmq githubリポジトリに最近追加されましたhere

これは最新のリリース(4.2.1)にはまだ含まれていませんが、次のリリースにあるはずです。

私はcmakeを使用してヘッドバージョンをインストールしてからcppzmqをインストールしました。これはfind_package(ZeroMQ REQUIRED)を使用してlibzmqを探し出します。すべては魅力のように働いた。

+0

を使ってZeroMQの最新バージョンをインストールするまで、Mac OS XとUbuntuでエラーが発生しました。あなたがHEADまたは今後のリリースを使用する能力を持っていれば行く。あなたがシステムパッケージを使用して立ち往生しているなら、私の前の答えが行く方法です。また、pkg-configをサポートしていて、cmake configのサポートをしていないライブラリにも外挿することができます。 – nega

関連する問題