2012-01-20 31 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'を実行して、ファイルlibrary.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

関連する問題