一、背景
环境: 银河麒麟–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()