内容简介:翻译自:https://stackoverflow.com/questions/41251474/how-to-import-zeromq-libraries-in-cmake
我刚开始学习如何使用 zeromq 库并在不同的C项目中使用它们.
我写的示例代码(实际上是从教程中复制的)是这样的:
// 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; }
并使用以下命令构建此文件的输出:
g++ main.cpp -o test -lzmq
生成文件没有问题.
我遇到的问题是我想使用CMake构建文件.因此,我编写了一个CMakeLists.txt文件,如下所示:
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
CMake不包括对0mq的直接支持,0mq不包括对CMake的直接支持.但是,0mq确实支持pkg-config,我们可以用它来帮助我们.既然你提到你在Ubuntu 14.04上,请确保你已经完成了sudo apt-get install libzmq3-dev来安装0mq库,头文件和pkg-config .pc文件.
然后使用我从上面的版本修改过的以下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 [ 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
如果你看一下编译行,你会发现它
>添加了C 11支持(使用-std = gnu 11标志)
>没有-I / path / to / zmq标志.那是因为Ubuntu将zmq.hpp转储到/usr/include中,并且CMake足够聪明,知道这是一个默认路径,所以它什么都不做
如果查看链接行,您会注意到libzmq.so已经通过它的完整路径包含在内.有些人不喜欢(包括我自己),而更喜欢-L / lib / dir -lmylib.使用完整路径是“CMake方式”,当你与CMake一起成长并将其用于更大更复杂的项目时,你会真正体会到它(你仍然可能不喜欢它.)
还要注意,既然你在Ubuntu上我们可以欺骗并使用dpkg -L libzmq3-dev来查找我们感兴趣的文件的位置,然后将它们添加到你原来的CMAKE_CXX_FLAGS行,但这是作弊,更重要的是,不便携.
翻译自:https://stackoverflow.com/questions/41251474/how-to-import-zeromq-libraries-in-cmake
以上所述就是小编给大家介绍的《如何在cmake中导入zeromq库?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。