看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Android (AOSP) on Linux 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 我現在要將一個library整合進AOSP中,先前都已porting完成可以正確呼叫, 但今天要修改API的參數時,發現link error: 原先我的header裡是這樣寫:(舉例) extern "C" { int func1(); int func2(); } func1和func2都可以正常被link到,用readelf -s看symbol,也是沒有C++前後綴詞的。 今天我打算新增一個參數, extern "C" { int func1(); int func2(int param1); } 發現link error (undefined reference),用readelf去看,發現func2的symbol變成 _Z10func2i,也就是變得跟沒加extern "C"時一樣。 我試著再新增一個func3,也是和func2一樣的情況。 clean build、手動刪除obj都試過了,但還是一樣。 之前也有修改過參數,但都沒有問題,請問我是不是漏掉了什麼步驟呢? 餵入的資料(Input):預期的正確結果(Expected Output): symbol應沒有C++符號詞綴。 錯誤結果(Wrong Output): symbol有C++符號詞綴。 程式碼(Code):(請善用置底文網頁, 記得排版) 如上面問題說明。 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.87.128.158
Bencrie:int func1(void); 不知道有沒有差 12/26 20:00
應該和這無關 最開始的問題是我在某個有三個參數的function中打算新增參數,結果一加就error 也不是參數數量的問題,因為有個function參數將近10個也沒問題...
scwg:func2 的 definition 要用 gcc compile,或也包在extern "C"裡 12/26 21:06
scwg:咦不對, 只要有 include 同個 header 應該就夠了啊 12/26 21:11
Feis:我懷疑他的 definition 忘記加 int param2... 12/26 21:29
Feis:所以被認為跟宣告的不是同一個 12/26 21:30
cpp確定有改到,我還rollback到原本正常的版本,手動新增一個參數,結果就像 這樣了... ※ 編輯: lwecloud 來自: 218.161.19.17 (12/26 21:35) ※ 編輯: lwecloud 來自: 218.161.19.17 (12/26 21:36)
Feis:所以現在已經確定 .h 內跟 .cpp 都長得 "一模一樣" 了? 12/26 21:37
是的,我很肯定...還複製貼上過了(有記得加上/拿掉分號) 昨天把整個系統rebuild 還是一樣orz ※ 編輯: lwecloud 來自: 219.87.128.158 (12/27 09:38) 找到問題點了,之前在複製.h的時候多放了一個在別的資料夾中 變成這樣: /MyProj/lib.cpp /MyProj/lib.h /MyProj/include/lib.h 原本應該是改/MyProj/include/lib.h這個檔,但compiler優先去讀/MyProj/lib.h 把/MyProj/lib.h刪掉就正常了。 的確如Feis板友所猜測的原因一樣,是宣告和定義不同造成的,只是盲點在一個重 複的檔案...。 感謝各位板友<(_ _)> ※ 編輯: lwecloud 來自: 219.87.128.158 (12/27 09:45)
scwg:補個 side note, 在這種問題可以用 g++ -E lib.cpp 看出來 12/27 11:46