- 締切済み
リンクエラーについて
C++の初心者です。 C++で作成したプログラムがリンクでエラーになります。 エラーの内容は、”LNK2019:未解決のシンボル_IoInitが間数XXXXで 参照されました。”です。 IoInit関数を含むライブラリ(C:\JAVAC\ciolib.lib)をリンクする必要があり、リンカの/DEFAULTLIBオプションでライブラリを指定しましたが、状況は変わりません。 リンカの内容は、以下のとうりです。 cl -I:"C:\Program Files\Microsoft Visual Studio 8\VC\include" -I:C:\j2sdk1.4.2_18\include -I:C:\j2sdk1.4.2_18\include\win32 -LD -FeCiolibJNI.dll CiolibJNI.cpp /link -libpath:"C:\Program Files\Microsoft Visual Studio 8\VC\lib" /NODEFAULTLIB:C:\JAVAC\ciolib.lib /DEFAULTLIB:C:\JAVAC\ciolib.libの指定が悪いのか状況は変わりません。それとも、指定オプションが悪いのか困っています。 リンカが悪いのであれば、修正箇所を教えてください。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- chie65536
- ベストアンサー率41% (2512/6032)
もう1つ。 ライブラリが外部参照シンボルに _ を付けないコンパイラ用のライブラリで、使用するコンパイラが外部参照シンボルに _ を付けるコンパイラの場合、ライブラリ内の実シンボルは「IoInit」になっていますが、呼び出し側が「_IoInit」を呼ぼうとする為、リンカが名前解決に失敗します。 異なる処理系用のライブラリを使用する場合、関数の呼び出し規約が異なる可能性があるので、下手をすると暴走します。ご注意を(cdeclで定義された関数を、stdcallとして外部定義して呼び出すと、大変な事になるのと同じ)
- chie65536
- ベストアンサー率41% (2512/6032)
C++では、関数の外部参照シンボルは「修飾子」が付加されます。 ライブラリ内の関数の「実シンボル名」に「修飾子」が付いている場合、その関数を「extern "C"」で外部参照宣言して呼び出すと、呼び出し側では「修飾子がないもの」として呼び出そうとします。 すると「ライブラリ側は修飾子付き、呼び出し側は修飾子なし」となり、リンカが名前解決に失敗します。 「IoInit関数のライブラリ上での定義」を確認して下さい。
お礼
ご回答、ありがとうございました。
- Wr5
- ベストアンサー率53% (2173/4061)
> /NODEFAULTLIB:C:\JAVAC\ciolib.lib NODEFAULT~になっていますが? VS2005をご利用のようですが、統合開発環境は使用されていないのでしょうか? 統合開発環境の場合は、 >・Visual Studio 開発環境でこのリンカ オプションを設定するには >このリンカ オプションは、Visual Studio 開発環境では使用できません。リンク フェーズにライブラリを追加するには、[入力] プロパティ ページの [追加の依存ファイル] プロパティを使用します。 と、MSDNに記述されています。 コマンドライン(またはmakefile)でしょりするのであれば、 ライブラリをフルパスで指定すればよいかと。 cl -I:"C:\Program Files\Microsoft Visual Studio 8\VC\include" -I:C:\j2sdk1.4.2_18\include -I:C:\j2sdk1.4.2_18\include\win32 -LD -FeCiolibJNI.dll CiolibJNI.cpp /link -libpath:"C:\Program Files\Microsoft Visual Studio 8\VC\lib" C:\JAVAC\ciolib.lib ですね。
お礼
ご回答、ありがとうございました。