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