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'を実行して、ファイルlibrary.aのエクスポートされたシンボルをすべて一覧表示します) –
コンパイル時にコンパイラがC関数の名前を付ける一般的な方法は、アンダースコアを前置することです。 'mexFunction'というエラーメッセージでわかるように、それもあります。 'gfsOpen'を含むファイルが本当にライブラリに追加されていますか? –