2012-01-20 64 views
0

我試圖編譯一個C庫,然後一些外部C代碼喜歡它,而我的外部代碼在庫中找到符號時遇到了問題。我不明白這個大屁股,我希望有人能幫助。以下是詳細信息:當與外部庫鏈接時,符號名稱中的下劃線

1)我正在使用Mac。我已經將該庫編譯爲xcode中的靜態.a庫。

2)我試圖從庫中編譯外部代碼調用函數。我已經包含頭文件,並且在gcc調用中指定了它的位置和庫。編譯似乎完成,但鏈接失敗,說明找不到符號。

3)缺少的符號被列爲_FunctionName,其中FunctionName是我調用的函數的名稱。

我不清楚爲什麼編譯器/鏈接器爲我的函數名添加了下劃線。但我的天真猜測是這就是爲什麼在圖書館找不到符號的原因。

外部代碼編譯通過MATLAB的mex()函數完成,後者在後臺進行gcc調用。

我會很感激任何人可能有的想法。

gcc-4.2 -c -Igsf_0303/ -I/Applications/MATLAB_R2011b.app/extern/include \ 
-DMATLAB_MEX_FILE -fno-common -no-cpp-precomp -arch x86_64 -isysroot \ 
/Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5 -fexceptions \ 
-DMX_COMPAT_32 -O2 -DNDEBUG "gsf_tester.c" 

gcc-4.2 -O -Wl,-twolevel_namespace -undefined error -arch x86_64 -Wl, \ 
-syslibroot,/Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5 -bundle -Wl,\ 
-exported_symbols_list,/Applications/MATLAB_R2011b.app/extern/lib/maci64/mexFunction.map \ 
-o "gsf_tester.mexmaci64" gsf_tester.o gsf_0303/libgsf.a \ 
-L/Applications/MATLAB_R2011b.app/bin/maci64 -lmx -lmex -lmat -lstdc++ 

Undefined symbols: 
    "_gsfOpen", referenced from: 
     _mexFunction in gsf_tester.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

mex: link of ' "gsf_tester.mexmaci64"' failed. 
+0

做你的符號庫中的什麼名稱的架構? (運行'nm -g library.a'以列出文件庫中的所有導出符號.a) –

+1

預編譯下劃線是編譯器在編譯時命名C函數的常用方法。正如你可以在錯誤信息中看到'mexFunction'也有它。你確定包含'gfsOpen'的文件真的被添加到庫中嗎? –

回答

0

這是猜測。首先,約阿希姆的評論是正確的。 C函數名稱將始終以下劃線作爲前綴。所以這不是問題。

因此,庫中缺少gfsOpen(),或者它不可見,或者在鏈接gfs_tester.o時看不到。

因此,檢查gfsOpen是否在庫中。這應該這樣做

otool -t -v sgsf_0303/libgsf.a | grep gsfOpen 

上面的反彙編文件,然後greps你感興趣的符號從它。可能有更好的方法,但我沒有打算研究它。

檢查它沒有被宣佈static

確保庫匹配(otool -fv

+0

謝謝你的快速回復。使用你建議的工具,我發現gsfOpen確實不在符號表中。這導致了對我實際編入我的圖書館的進一步調查。我創建了另一個代碼來測試這個庫,當我無意中編譯庫時,它被包含在項目的文件列表中。刪除這個並重新編譯後,我能夠在MATLAB中編譯和運行我的函數而沒有錯誤。我不明白我的愚蠢的細節,但我很感激它的工作,更感謝你的幫助。 – vschmidt

+0

@ user2932:您應該用您的評論文本爲您自己的問題創建一個答案並接受它。這樣,任何來這裏尋找答案的人都會更輕鬆地找到解決方案。 – JeremyP