multiple definition of......first defined here

一、背景

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

猜你喜欢

转载自blog.csdn.net/qq_41104439/article/details/132324302