[問題] linux呼叫so函式,執行出現undefined s..

看板C_and_CPP作者 (曙光)時間3年前 (2021/02/16 01:04), 3年前編輯推噓2(2029)
留言31則, 7人參與, 3年前最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Ubuntu 18.04LTS(在樹莓派pi4) 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) g++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) Boost;UHD 問題(Question): 各位前輩好,目前遇到了一個問題,在建置so library檔時,呼叫內部函式出現了undefi ned symbol,目前完全不知道解決的方向,希望各位前輩能夠指導 餵入的資料(Input): sync_to_gps8.cpp sync_to_gps8.i sync_to_gps8.h makefile 123.py https://glot.io/snippets/fvwlmsu43t 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): https://i.imgur.com/ry81o7C.jpg
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) https://glot.io/snippets/fvwlmsu43t 這是123.py的程式碼 https://glot.io/snippets/fvwz2xprsu 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.225.58.19 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1613408683.A.529.html

02/16 02:16, 3年前 , 1F
你的 Python123 檔案呢?
02/16 02:16, 1F

02/16 02:17, 3年前 , 2F
123.py 才對
02/16 02:17, 2F
A大您好,我忘記放了,真的不好意思 https://glot.io/snippets/fvwz2xprsu 我有另外執行123.py,就會出現圖片這樣的結果

02/16 04:17, 3年前 , 3F
這個exception訊息很明確,就是swig載入這隻程式時,找不
02/16 04:17, 3F

02/16 04:17, 3年前 , 4F
到原本講好要給他用的boost:: program_options:: value
02/16 04:17, 4F

02/16 04:17, 3年前 , 5F
_semantic_codecvt_helper,同時,發生這個問題的時間點是
02/16 04:17, 5F

02/16 04:17, 3年前 , 6F
在執行程式的時候,這意味著程式碼都已經編譯完成,沒有語
02/16 04:17, 6F

02/16 04:17, 3年前 , 7F
法上的錯誤
02/16 04:17, 7F
※ 編輯: asd24693120 (223.137.6.236 臺灣), 02/16/2021 09:13:09 K大您好,但是我不是很懂已經有include進去也能用cpp跑,為什麼轉成so就會找不到這 呢?想請問這樣的問題該如何解呢? ※ 編輯: asd24693120 (118.169.185.235 臺灣), 02/17/2021 13:49:30

02/17 18:43, 3年前 , 8F
應該是沒-lboost_program_options吧
02/17 18:43, 8F
那想請問該如何解決呢

02/18 08:29, 3年前 , 9F
找個工具檢查shared library相依關係
02/18 08:29, 9F
請問k大是這個嗎? https://i.imgur.com/rVjD9Fr.jpg

02/18 17:54, 3年前 , 10F
你在 .h 上加上 extern "C" 試試
02/18 17:54, 10F

02/18 18:33, 3年前 , 11F
c++編譯的so檔function name是亂碼
02/18 18:33, 11F

02/18 18:34, 3年前 , 12F
python 跟c語言在link的時候找到是明碼。
02/18 18:34, 12F

02/18 18:35, 3年前 , 13F
加上extern c就可以了。
02/18 18:35, 13F
我在.h檔加上extern c後,好像還是一樣 https://i.imgur.com/y6SX9oX.jpg

02/18 18:41, 3年前 , 14F
你可以嘗試把c++跟C語言編譯出來的so檔dump出來,檢查f
02/18 18:41, 14F

02/18 18:41, 3年前 , 15F
unction name是否為亂碼。
02/18 18:41, 15F

02/18 19:48, 3年前 , 16F
亂碼…恩…
02/18 19:48, 16F

02/18 21:25, 3年前 , 17F
那個看起來亂碼的其實是叫mangling,這個錯誤跟mangling
02/18 21:25, 17F

02/18 21:25, 3年前 , 18F
沒關係
02/18 21:25, 18F
※ 編輯: asd24693120 (118.169.185.235 臺灣), 02/19/2021 11:24:05 ※ 編輯: asd24693120 (118.169.185.235 臺灣), 02/19/2021 11:30:33 謝謝k大的解釋,想請問k大目前這樣該怎麼處理 ※ 編輯: asd24693120 (118.169.185.235 臺灣), 02/19/2021 11:31:26 ※ 編輯: asd24693120 (118.169.185.235 臺灣), 02/19/2021 11:35:10

02/19 13:14, 3年前 , 19F
因為可能帶入錯誤的情境很多,主要是查你用的compiler/l
02/19 13:14, 19F

02/19 13:14, 3年前 , 20F
ibrary版本和編譯時的參數,可能的就是下了std=c++14這些
02/19 13:14, 20F

02/19 13:14, 3年前 , 21F
,以及有沒有連結到正確的library
02/19 13:14, 21F

02/19 16:55, 3年前 , 22F
要不要嘗試用ctypes??
02/19 16:55, 22F

02/19 16:58, 3年前 , 23F
我自己用python call c library都會用ctypes,可以省
02/19 16:58, 23F

02/19 16:58, 3年前 , 24F
掉很多麻煩。
02/19 16:58, 24F
因為之前有參考過ctypes的用法,也有自己嘗試過,但因為失敗,所以就有點放棄,不知 道z大是否能指導?

02/19 18:10, 3年前 , 25F
如果只是想測看看能不能動,把program option 帶入的參數
02/19 18:10, 25F

02/19 18:10, 3年前 , 26F
直接刻在程式裡,把program option 相關的程式碼移除掉,
02/19 18:10, 26F

02/19 18:10, 3年前 , 27F
應該有機會跑完
02/19 18:10, 27F
回k大,因為這個c++這個程式碼是我學長給我的,因此我也不知道是否哪些地方可以忽略 ,想請問照您這樣的方法,是否會影響到原本的結果? ※ 編輯: asd24693120 (111.250.156.31 臺灣), 02/20/2021 16:41:02

02/20 18:37, 3年前 , 28F
program option 只是讀取使用者輸入的參數
02/20 18:37, 28F

02/20 23:47, 3年前 , 29F
以前碰過compiler判斷沒使用到的function所以沒l
02/20 23:47, 29F

02/20 23:47, 3年前 , 30F
ink,但是實際跑是會跑到,然後就會出這種runtim
02/20 23:47, 30F

02/20 23:47, 3年前 , 31F
e 才找不到symbol 的問題,給你參考。
02/20 23:47, 31F
文章代碼(AID): #1WAgchKf (C_and_CPP)