Visual studio c++ dll作成時のエラー

このQ&Aのポイント
  • c初心者のためのVisual Studio C++でのDLL作成時に発生するエラーについて
  • ユーザーからもらったaaa.dllに含まれるCalc_UL関数を呼び出すためのbbb.dllを作成しようとしていますが、ビルドがうまくいきません
  • リンクエラーや外部シンボルの未解決など、問題の原因を特定するためにはaaa.dllの指定が必要です
回答を見る
  • ベストアンサー

Visual studio c++ dll作成時のエラー

c初心者です。 ユーザーからもらったaaa.dllにある関数Calc_UL(struct型)をコールするbbb.dllを作成しようしています。 コンパイルはとおるのですが、 dllのビルドがうまくいきません。ユーザーからはaaa.dllとaaa.libとaaa.hだけもらっており、aaa.libにはリンク設定をしています。 bbb.obj : error LNK2001: 外部シンボル ""int __stdcall Calc_UL(struct ULData *)" (?Calc_UL@@YGHPAUULData@@@Z)" は未解決です Debug/bbb.dll : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー aaa.dllを指定するところが特に無いのですが、どこかで指定しないといけないのでしょうか? よろしくお願いします。

noname#240292
noname#240292

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

toro_puelさんのソース、拡張子が.CPPになっていませんか? そのため、C++の形式でexportされた関数をリンカがlibファイルから見つけることができないというエラーです。 本当にC言語しか使っていないのなら、ソースの拡張子を.Cにしてください。 こうすれば、Cの形式でlibファイルの中から関数名をリンカが見つけてくれるはずです。 ただし、ソースがCではなく、C++であれば、aaa.hにextern "C"の宣言が必要になります。

noname#240292
質問者

補足

回答ありがとうございます。 C初心者と書いてしまいました、すみません。 私が書いているのはC++です。おそらくaaa.hもc++です。 そうなると、どうすればよいのでしょうか?

その他の回答 (2)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

とりあえず、DLLのエクスポート情報を確認してください。 Dependency WalkerというツールがVC++をインストールすると一緒にインストールされているはずです。 これで、エクスポートしている関数名等を知ることができます。 ここに、Calc_ULという名前の関数が表示されるか確認してください。 どんな風に表示されるかは、kernel32.dllでも見てみてください。 コマンドラインで使用できるDUMPBINというツールでもどちらでもかまいませんけど。 >aaa.hは以下の記述になっています。extern Cは書かれてません。これはCで書かれている、てことなんでしょうか? そうとは限りません。 C++で書かれているときもあります。 ただし、今回の事象が "(?Calc_UL@@YGHPAUULData@@@Z)" は未解決です "という エラーが出ているので、DLL側はCで書かれている、もしくは、extern "C"を使ってCの形式でエクスポートされていると 予想したからです。 >ちなみにこちら側(bbb.cc側)をextern "C"で囲んでみたりもしたのですが、事象は変わりませんでした。 >これは意味の無いことなのでしょうか? ちなみにどこを囲んだんですか?自分で作成した関数ですか?

noname#240292
質問者

お礼

大変助かりました。 ありがとうございました。一人の方にポイント2つ付けられるかな。。。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>>ただし、ソースがCではなく、C++であれば、aaa.hにextern "C"の宣言が必要になります。 >私が書いているのはC++です。おそらくaaa.hもc++です。 >そうなると、どうすればよいのでしょうか? ヘッダというよりは、DLLの記述言語が重要なんですけど。 おそらくCで記述されていませんか? それで、私が書いたようにヘッダの関数宣言部にextern "C"はありますか? たとえば、 extern "C" int __stdcall Calc_UL(struct ULData *); とか、 extern "C" { int __stdcall Calc_UL(struct ULData *); }; とか。 これにより、コンパイラによる独自の関数名の修飾が行われなくなります。 ちなみに、なんでこんなことになるかというと、C++はオーバーロードで同名の関数が許されるので、 関数名だけをエクスポートの情報として外に公開することが出来ないからです。 このため、コンパイラが引数の情報を元に、勝手に関数名を修飾しています。 extern "C"を宣言すると、Cと同様なexport情報が生成されるので、今回のようなことは起こらなくなります。 ただし、当然ながら、extern "C"で宣言した関数は、引数が違っても同一名称の関数はNGです。

noname#240292
質問者

お礼

補足を書いた後、aaa.hにextern "C"を書いたら解決しました。本当にありがとうございました。 最後に教えてください。 ・aaa.dllはCだったのですか? ・だとしたら、taka_tetsuさんはどうしてaaa.dllがCだとわかったのですか? 度々申し訳ありませんが、よろしくお願いします。

noname#240292
質問者

補足

度々申し訳ありません。 DLLの記述言語もおそらくC++。。。でもこれはきちんと確認してみます。 aaa.hは以下の記述になっています。extern Cは書かれてません。これはCで書かれている、てことなんでしょうか? ちなみにこちら側(bbb.cc側)をextern "C"で囲んでみたりもしたのですが、事象は変わりませんでした。 これは意味の無いことなのでしょうか? #ifdef WIN32 #include <windows.h> #endif ・・・ #ifdef _WIN32 int __declspec(dllexport) WINAPI Calc_UL(struct ULData *); #else int extern Calc_UL(struct ULData *); #endif

関連するQ&A

  • Visual C++ 2005 Express EditionでLINK2019エラー

    Visual C++ 2003.netからVisual C++ 2005 Express Editionに移行した際に、以前書いたプログラムがリンクエラーで動かなくなってしまいました。 追加するLibディレクトリが足りないのかと思ったのですが、何が足りないのか見つけることができませんでした。 解決法を教えていただけないでしょうか。 OSはWindows XPです。 よろしくお願いします。 エラーメッセージの内容↓ ------------------------------- error LNK2019: 未解決の外部シンボル __imp__GetWindowPlacement@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__DispatchMessageA@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__TranslateMessage@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__PeekMessageA@20 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__ValidateRect@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__ShowWindow@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__SetWindowPos@28 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__GetWindowRect@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__GetClientRect@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__CreateWindowExA@48 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__GetSystemMetrics@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__RegisterClassExA@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__LoadCursorA@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__DefWindowProcA@16 が関数 "long __stdcall WindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 error LNK2019: 未解決の外部シンボル __imp__PostQuitMessage@4 が関数 "long __stdcall WindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 現在追加されているLibディレクトリ↓ ------------------------------------------- $(VCInstallDir)lib $(VCInstallDir)PlatformSDK\lib $(FrameworkSDKDir)lib $(VSInstallDir) $(VSInstallDir)lib C:\Program Files\Microsoft Platform SDK\Lib C:\Program Files\Microsoft DirectX SDK (April 2007)\Lib\x86

  • C++でdllの呼び出しについて

    使用環境はVisualStudio2008、WindowsXPです。 http://www.voidtools.com/Everything-SDK.zip こちらのSDKに添付されているdllを呼び出したいと思います。 dll、lib、ヘッダーファイルをプロジェクトと同じフォルダに入れて以下のようなコードを書いてみたのですが、リンカエラーになりました。 #pragma comment(lib, "everything.lib") void __stdcall Everything_SetSearch(LPCTSTR lpString); void main(void){ Everything_SetSearch(L"ああ"); } ビルドエラーの内容 error LNK2019: 未解決の外部シンボル "void __stdcall Everything_SetSearch(wchar_t const *)" (?Everything_SetSearch@@YGXPB_W@Z) が関数 _main で参照されました。 fatal error LNK1120: 外部参照 1 が未解決です。 何か初歩的なミスをしている気もしますが、突っ込みなどなど回答の方よろしくお願いします。

  • DLL呼び出しAPのリンクエラーについて

    DLL作成初心者です。 当方で簡単なDLLを作成しました。 試しに、下記の呼び出しAP(EXE)を作成しようと したのですが、リンクエラーになります。 どうしてでしょうか? 呼び出しAP #include <windows.h> int main(){ static HINSTANCE hDLL; hDLL = LoadLibrary(TEXT("DLL_TEST.DLL")); if (hDLL) FreeLibrary(hDLL); return 0; } リンクエラーは下記 IBCD.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です Debug/TEST.exe : fatal error LNK1120: 外部参照 1 が未解決です また上記"_WinMain@16"のライブラリーをリンクさせると SCRNSAVE.LIB(scrnsave.obj) : error LNK2005: _main はすでに test.obj で定義されています SCRNSAVE.LIB(scrnsave.obj) : error LNK2001: 外部シンボル "_ScreenSaverProc@16" は未解決です SCRNSAVE.LIB(scrnsave.obj) : error LNK2001: 外部シンボル "_ScreenSaverConfigureDialog@16" は未解決です SCRNSAVE.LIB(scrnsave.obj) : error LNK2001: 外部シンボル "_RegisterDialogClasses@4" は未解決です Debug/TEST.exe : fatal error 等のエラーになります。 解決策を教えてください。

  • C++ memory.dllサンプルが実行できない

    http://www.vector.co.jp/soft/win95/prog/se358509.html のmemory.dllを用いてプロセスメモリを弄るソフトを作ってみようと思い まず同梱されているサンプルをVisual Studio 2010 Professionalでコンパイルしてみようとしたのですが (サンプルの場所はダウンロードしたZIP内の\サンプル集\C言語\ のsample.cpp Memory.hです。) 1>sample.obj : error LNK2019: 未解決の外部シンボル _WriteMemory@16 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 1>sample.obj : error LNK2019: 未解決の外部シンボル _ReadMemory@16 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 1>C:\Users\hogehoge\Documents\Visual Studio 2010\Projects\testtesttest\Debug\testtesttest.exe : fatal error LNK1120: 外部参照 2 が未解決です。 と出力され、コンパイルされません。 何か問題があると思い、Google検索で色々調べたのですが分かりません・・・ 宜しければご助言を頂きたいです。お願い致します。

  • BCBで作成したDLLを、VC++で静的リンクさせる方法

    BCBで作成したDLLを、VC++で静的リンクさせる方法 Borland C++ Builderで作成したDLLを、VC++アプリケーションで利用できるように LIBファイルに変換したいのですが、上手くいきません。 下記の手順を踏みました。 1. BCBでDLL作成   「VC++スタイルのDLL」で作成、   「VCLを使う」「CLXを使う」「マルチスレッドを使う」はチェックせず 2. コマンドラインで「IMPDEF.exe」を使用して、dllからdefファイル作成   (IMPDEF.exeは、\Borland\CBuilder6\Binに格納されていた) 3. コマンドラインで「LINK.exe」「LIB.exe」を使用して、defからlibファイル作成   (LINK.exeとLIB.exeは、\Microsoft Visual Studio\VC98\Binに格納されていた) 4. VC++プロジェクトファイルを保存したフォルダに、DLLファイルとlibファイルをコピー 5. VC++の「プロジェクト」-「設定」-「リンク」-「オブジェクト/ライブラリモジュール」に   作成したlibファイルを追加 VC++プロジェクトをビルドすると、下記のエラーメッセージが表示されます。 ///////////////////////////////////////////////////////////////////////////////// dllread.obj : error LNK2001: 外部シンボル "__imp__(関数名)@0" は未解決です LIBC.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です Release/dllread.exe : fatal error LNK1120: 外部参照 2 が未解決です。 link.exe の実行エラー ///////////////////////////////////////////////////////////////////////////////// BCBとVC++のバージョンは、下記の通りです。 BCB Professional 6.0 VC++ 6.0 ちなみに、同じDLLを動的リンクで利用することは出来ました。 初心者の質問で申し訳ございませんが、解決策が分かる方がいらっしゃいましたら 教えていただけないでしょうか?

  • ビルドする時のエラー。(初心者です)

    リンク中... LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です Debug/MousMov.exe : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー というエラーがでます。 何がいけなくて対処方法はどうすればいいのでしょう。 初めてビルドするときは、エラーは何も出ないのですがもう一回するとこのエラーがでます。どうすればいいんですか?よろしくお願いします。

  • visual fortranのコンパイル時のエラー

    visual fortranでコンパイルをすると最後に LINK : fatal error LNK1181: cannot open input file "C:\DOCUME~1\dfor.lib" というエラーが出てしまいます。 ちなみにOSはXPProで、普段使ってるユーザーアカウントではなく Administratorでログインすると問題なく使えます。 インストールが普段のユーザーアカウントではできず、 administratorでしたことが影響しているのでしょうか。 dfor.libですが友達のPCにも入っていませんでした。 どなたか教えてください。

  • VCで作成したDLLをBCBから呼び出す方法

    皆さん こんにちは。 VCで作成したCのAPIを実装したDLLをBCB6.0で作成したアプリケーションから呼び出そうとしています。 コンパイルは通るのですが、リンク時に以下のエラーメッセージが表示されてしまいます。   [リンカ エラー] 外部シンボル 'My Function' が未解決(C:\BCB\***.OBJ が参照) BCB6のフォームプロジェクトからDLLを利用するために、以下の手順を行いました。 (1)DLLをbcb用に変換する   implib -a aaa.lib aaa.dll (2)プロジェクトにaaa.libを追加 (3)aaa.dllをプロジェクトのフォルダに追加 (4)コードを以下のように実装しました    extern "C" __stdcall ulong SysInitialize(void);  //プロトタイプ宣言    ulong ulRetVal = SysInitialize(); //コード内での呼び出し この状態でコンパイルは通るのですがリンカでエラーが発生します      [リンカ エラー] 外部シンボル 'SysInitialize' が未解決(C:\BCB\TELIGEV\MAINDLG.OBJ が参照 他のサイトで調べたところ、C++特有の修飾子"@***"がついている場合に同じエラーが出るとのことだったので、dumpbin.exeを使ってDLL内の関数をダンプしたところ、関数名にはアンダースコアや@などは関数名についていないようです。 dumpbinの出力結果   1 1D 000065A0 SysInitialize このほか、自分なりに調べたところ、以下のサイトを見つけたのですが、英語力の弱さから解決策を見出すまでには至りませんでした。 Using Visual C++ DLLs with C++Builder http://bcbjournal.org/articles/vol4/0012/Using_Visual_C_DLLs_with_CBuilder.htm どなたか、ご助言いただけると助かります。 よろしくお願いします。

  • CのDLLをVC++でコンパイルしたいのですが、エラーになってしまいます。

    c言語の初心者なのですが、質問させて下さい。 javaからCのDLLを呼び出したく、 (下記のソースを書いたのですが、VC++でコンパイルすると LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です Debug/HelloWorld.exe : fatal error LNK1120: 外部参照 1 が未解決です。 と出てしまいます。 過去ログ等を見て、作成しているプロジェクトが悪いのかなと思い、 MFC appWizark(dll) win32 Application win32 Console Application win32 Dynamic-Link Library 等を作ってみてコンパイルしてみたのですが、駄目でした。 ちなみにDOSプロンプトで cl -IC:\j2sdk1.4.2_10\include\win32 -LD HelloWorl d.c -o HelloWorld.dll と実行するときちんとコンパイルできて、正常に実行も出来ました。 VC++でどうやればコンパイルできるのでしょうか? #include "HelloWorld.h" JNIEXPORT void JNICALL Java_HelloWorld_printMessage (JNIEnv *env, jobject me) { printf("Helo World!!!\n"); return; }

  • スタティックリンクライブラリで2重リンクできる?

    スタティックリンクライブラリで2重リンクをしようとすると、warning LNK4006が発生してしまいます。 メッセージ: "~で定義されています; 2 つ目以降の定義は無視されます" 例えば、 aaa.libがbbb.libとccc.libをリンクしてて、bbb.libとccc.libはそれぞれddd.libをリンクしているとします。*.libはすべてスタティックリンクライブラリで提供を考えています。   [ aaa.lib ]    |   | [bbb.lib] [ccc.lib]   |     | [ddd.lib] [ddd.lib] 調べてみると「ライブラリーを結合する時に,このエラー・メッセージが表示された場合,ライブラリーに既に存在しているシンボルを追加しようとしています。」ということで、要は"ddd.lib"が重複してリンクされているという事のようなのですが、原因ばかりで解決策が分かりません。 LNK4006の解決法が分かれば良いのですが、最終的にはこの構成で"aaa.lib"だけで提供するようなライブラリを作成したいです。実現するためにはどのようにしたら良いのでしょうか?アイデアを頂けたら助かります。また詳しい方がいらっしゃいましたらご教授お願いいたします! ※Windows2000でVisualStadio.NET2003を使用してます。