zmq.hpp编译报错:‘is_trivially_copyable’ is not a member of ‘std’

现象

在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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值