现象
在ubuntu18.04上编译好的代码,拉到centos7上编译时,报错如下:
是zmq.hpp报的错,已经使用-std=c++11选项。
使用zmq库的是libzmq_4.3.2,zmq.hpp来自cppzmq,它是在libzmq上做了一层c++的封装。
定位
网上查了一下,有说是GCC版本太低导致的。
从ubuntu18.04到centos7,gcc的版本也由7.5.0下降到了4.8.5。
有可能就试一下,升级gcc,注意,不建议这样操作,因为一旦升级了gcc,原来在该服务器上编译的代码可能都要重新编译一遍了。
所以在一台新机器上尝试,无果。因为这时发现了问题所在。
原来cppzmq库虽然是header-only的,但是需要编译才能使用。
其实解决方案是只需要在centos上重新编译一下。
解决
删除代码仓库中zmq.hpp(它会因不同机器而不同,不应该放在源码库中)。
下载cppzmq,编译:
cd cppzmq-4.7.1/
mkdir build
cd build
cmake ..
make -j4 install
这里cmake时又报错:Unknown CMake command "catch_discover_tests"
。
解决方法是关闭test:cmake -DCPPZMQ_BUILD_TESTS=OFF …
结果如下:
安装完成后,在应用代码的CMakeLists.txt中增加以下:
#find cppzmq wrapper, installed by make of cppzmq
find_package(cppzmq)
target_link_libraries(${APP_NAME} cppzmq)
cmake会自动引用头文件和库文件,不用手动链接了(-lzmq)
小结
在代码仓库管理时,需要清楚地知道添加的文件是否存在依赖。
如果依赖于操作系统和环境,就需要单独管理,或者要求环境具体依赖情况下才能编译。
不然可能会导致在一个系统中编译好的代码,在另一系统中无法编译的情况,定位麻烦,浪费时间。
参考
https://github.com/zeromq/cppzmq
https://github.com/zeromq/cppzmq/issues/334