故事背景 最近同事遇到一個比較奇怪的問題,直接開門見山吧。在動態庫中調用靜態庫直接報錯了recompile with -fPIC,查看cmake的寫法也沒有問題,而且也是第一次遇見這個問題,所以就開啟了我的好奇之路。 探索之路 說實話我不喜歡百度,因為千篇一律,你抄我的我抄你的,沒有任何參考價值,直 ...
故事背景
最近同事遇到一個比較奇怪的問題,直接開門見山吧。在動態庫中調用靜態庫直接報錯了recompile with -fPIC
,查看cmake的寫法也沒有問題,而且也是第一次遇見這個問題,所以就開啟了我的好奇之路。
探索之路
- 說實話我不喜歡百度,因為千篇一律,你抄我的我抄你的,沒有任何參考價值,直接google吧,都是一些英文的解析文檔,基本上都能解決你遇到的問題。
Briefly, the error means that you can't use a static library to be linked w/ a dynamic one.
這句話我就不翻譯了。- The solution was to compile everything with
-fPIC
, and link shared objects with-shared
.Add-fPIC
toCFLAGS
orCXXFLAGS
for make-based projects.這句也不翻譯了,我覺得還是看英文比較好理解,翻譯出來沒有那個感覺。
經驗心得
In a word
- 動態庫中不可以鏈接靜態庫
- 如果想在動態庫中鏈接靜態庫,需要加上
-fPIC
重新編譯靜態庫,然後再在動態庫中鏈接就可以了。 - 查看是不是添加了-fPIC的命令:
readelf -d xxx.so | grep TEXTREL
- cmake中直接設置
set(CMAKE_CXX_FLAGS "-fPIC")
大家有興趣的可以自行瞭解下-fPIC
的作用。