商机网网站源码,wordpress下载代码,网站营销软文,wordpress自动生成二维码一、背景
环境#xff1a; 银河麒麟–ARM–GCC7.4.0 写了一个动态库#xff0c;依赖opencv和freeImage等第三方库#xff0c;用cmake进行编译。原本在centos6-x86-gcc7.5.0上面进行编译非常的顺利#xff0c;但是拿到麒麟arm上面编译就提示了这个错误#xff1a;这个报错…一、背景
环境 银河麒麟–ARM–GCC7.4.0 写了一个动态库依赖opencv和freeImage等第三方库用cmake进行编译。原本在centos6-x86-gcc7.5.0上面进行编译非常的顺利但是拿到麒麟arm上面编译就提示了这个错误这个报错的意思就是说: opencv中有一些变量和函数多次定义第一次是出现在freeimage里面
二、思考
查了一些资料大多是说变量和函数被重复定义了或者说没有添加条件编译的代码但是这些显然不匹配我的报错因为我的是两个流传甚广的第三方库也已经在环境里使用了挺长时间了 仔细想想这两个系统编译的差别很明显的一个就是gcc的版本不一样7.5版本通过了7.4版本没通过。那有没有可能是gcc的原因呢。之前确实也遇到过同一个现象在a版本中包警告而在b版本中报错误的。但是我现阶段还很难去具体定位这种版本的差异。
三、解决
可以通过添加gcc的链接选项来解决这种符号冲突-Wl,--allow-multiple-definition。此选项意为当有符号重定义时让链接器忽略错误使用解析时遇到的第一个定义而忽略后面再出现的。不过这种方法也是有风险的。
我在我的cmake链接部分加上这个链接选项(target_link_options)报错就消失了
if(WIN32)target_link_libraries(YeecohImageKit PUBLIC ${OpenCV_LIBS} ${FreeImage_LIBRARIES})
else()target_link_options(YeecohImageKit PUBLIC -Wl,--allow-multiple-definition)target_link_libraries(YeecohImageKit PUBLIC ${OpenCV_LIBS} ${Boost_LIBRARIES} ${ICU_LIBRARIES} ${FreeImage_LIBRARIES})
endif()