dポイントプレゼントキャンペーン実施中!

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の指定が悪いのか状況は変わりません。それとも、指定オプションが悪いのか困っています。
リンカが悪いのであれば、修正箇所を教えてください。

A 回答 (3件)

もう1つ。



ライブラリが外部参照シンボルに _ を付けないコンパイラ用のライブラリで、使用するコンパイラが外部参照シンボルに _ を付けるコンパイラの場合、ライブラリ内の実シンボルは「IoInit」になっていますが、呼び出し側が「_IoInit」を呼ぼうとする為、リンカが名前解決に失敗します。

異なる処理系用のライブラリを使用する場合、関数の呼び出し規約が異なる可能性があるので、下手をすると暴走します。ご注意を(cdeclで定義された関数を、stdcallとして外部定義して呼び出すと、大変な事になるのと同じ)
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございました。

お礼日時:2009/01/05 09:56

C++では、関数の外部参照シンボルは「修飾子」が付加されます。



ライブラリ内の関数の「実シンボル名」に「修飾子」が付いている場合、その関数を「extern "C"」で外部参照宣言して呼び出すと、呼び出し側では「修飾子がないもの」として呼び出そうとします。

すると「ライブラリ側は修飾子付き、呼び出し側は修飾子なし」となり、リンカが名前解決に失敗します。

「IoInit関数のライブラリ上での定義」を確認して下さい。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございました。

お礼日時:2009/01/05 09:57

> /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
ですね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!