我試圖編譯一個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.
做你的符號庫中的什麼名稱的架構? (運行'nm -g library.a'以列出文件庫中的所有導出符號.a) –
預編譯下劃線是編譯器在編譯時命名C函數的常用方法。正如你可以在錯誤信息中看到'mexFunction'也有它。你確定包含'gfsOpen'的文件真的被添加到庫中嗎? –