代碼從 Windows 移植到 linux 過程中遇到鏈接問題記錄

摘要:最近在做一個 sdk 的移植,需求是從 windows 平臺移植到 linux 平臺,編譯錯誤還比較容易解決,鏈接問題相對比較麻煩,這篇文章將遇到的鏈接錯誤進行簡單的記錄,以方便日後查詢。

1.錯誤一
錯誤信息:libavcodec.so undefined reference to symbol inflateEnd
解決辦法:在鏈接的時候添加選項 -lz

2.錯誤二
錯誤信息:Undefined reference to pthread_create
解決辦法:在鏈接的時候添加選項 -lpthread

3.錯誤三
錯誤信息: Undefined reference to SSL_new
解決辦法:在鏈接的時候添加選項 -lgnutls-openssl

4.錯誤四
錯誤信息:Undefined reference to dlopen
解決辦法:在鏈接的時候添加選項 -ldl

5.錯誤五
錯誤信息:Undefined reference to BN_new
解決辦法:在鏈接的時候添加 -lcrypto

6.錯誤六
錯誤信息:
在這裏插入圖片描述
解決辦法:這裏引用的 jsoncpp.so 動態庫有問題,將動態庫改成靜態庫,臨時解決問題,目前還沒有找到爲什麼引用動態庫會存在鏈接問題。

7.錯誤七
錯誤信息:Undefined reference to XineramaQueueScreens
解決辦法:在鏈接的時候添加 -lXinerama

8.錯誤八
錯誤信息:recompile with -fPIC
在這裏插入圖片描述
解決辦法:在編譯 ffmpeg 時,添加如下選項 --enable-pic --disable-asm
在這裏插入圖片描述
備註:如果發現添加了 --enable-pic 選項,但還是提示需要添加 -fPIC 重新編譯,可能需要添加 --disable-asm
針對這個問題,有些庫的 configure 文件中會給出 fpic 相關的控制選項,有些則沒有,對於沒有給出對應配置選項的情況,需要在 CMakeLists.txt 中添加相關的編譯選項。

add_compile_options(-fPIC)

9.錯誤九
錯誤信息:undefined reference to ‘x264_encoder_open_148’
在這裏插入圖片描述
解決辦法:出現這個鏈接錯誤的原因是在 linux 上重新編譯了 libx264 庫之後,仍然使用了 windows 端的頭文件,其實頭文件會引用一個編譯相關的結果宏,由於 windows 版的 x264 代碼版本和 linux 版的 x264 代碼不一致,導致 linux 提供的是 x264_encoder_open_157 ,找不到 148 這個函數。
在這裏插入圖片描述
將原來引用的 windows 版的頭文件改成 linux 頭文件即可。

10.錯誤十
錯誤信息:Undefined reference to XFixesGetCursorImage

解決辦法:添加鏈接選項 ${X11_Xfixes_LIB}
在這裏插入圖片描述
11.錯誤十一
錯誤信息:HMAC_CTX_init
在這裏插入圖片描述
問題原因:因爲系統自帶的 openssl 庫的版本太低,導致源碼中引用的函數在系統的庫中找不到。

解決辦法:從 github 下載 openssl 的源碼進行編譯鏈接,生成對應的 libssl.a 和 libcryto.a。
在編譯 openssl 的過程中,如果提示 recompile with -fPIC ,則需要在執行 config 時加上選項:

./config -fPIC no-asm

asm 是彙編優化開關,如果在加上 -fPIC 之後仍然提示 recompile with -fPIC ,那麼可以嘗試加上 no-asm。

12.錯誤十二
錯誤信息:cmake 始終鏈接系統目錄下的庫,而不是我在 find_library 中指定目錄下的庫

解決辦法:在 find_library 函數中添加參數 NO_DEFAULT_PATH , 就可以找到給定路徑下的庫。
在這裏插入圖片描述
可以順帶了解一下 find_library 的原型:
在這裏插入圖片描述
13.錯誤十三
這個錯誤是 windows 上用 vs 編譯出現的,因爲同屬於這一個項目,就都寫在這裏了。

錯誤信息:無法解析的符號:DwmGetWindowAttribute

解決辦法:在鏈接器->輸入->附加依賴項,添加 Dwmapi.lib

14.錯誤十四
這個錯誤也屬於 vs 編譯過程中遇到的。

問題背景:通過 cygwin 生成了一個 vs 工程,但是隻有 x64 版本的,我通過 vs 的配置管理器新建了一個 x86 版本的配置,複製了 x64 相關的配置信息,在編譯時遇到如下錯誤。

錯誤信息:error LNK1112: 模塊計算機類型“X86”與目標計算機類型“x64”衝突。

解決辦法:通過編輯器打開 vs 項目的 .vcxproj 文件,查找關鍵詞 “machine”,總共會查找到 8 處,會發現這 8 處的 machine 信息都是 x64,其中有 4 處應該改爲 x86,根據如下信息來判斷是否要改成 x86.
在這裏插入圖片描述
這個問題參考 error LNK1112: 模塊計算機類型“X86”與目標計算機類型“x64”衝突,在此表示感謝。

小結
以上問題是在這次 sdk 移植過程中遇到的,以後遇到類似的編譯或者鏈接問題會繼續在此基礎上進行補充。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章