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

このQ&Aのポイント
  • スタティックリンクライブラリで2重リンクをしようとすると、warning LNK4006が発生してしまいます。
  • LNK4006の解決法が分かれば良いのですが、最終的にはこの構成で"aaa.lib"だけで提供するようなライブラリを作成したいです。
  • 実現するためにはどのようにしたら良いのでしょうか?アイデアを頂けたら助かります。また詳しい方がいらっしゃいましたらご教授お願いいたします!
回答を見る
  • ベストアンサー

スタティックリンクライブラリで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を使用してます。

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

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.4

> でもスタティックだとそうしなくとも良いのですね。 DLLというのはある種完結してますので、ビルド時に不明なシンボルがあるとエラーになります。 一方、スタティックなライブラリはただのobjファイルのアーカイブです。 不明なシンボルがあっても関知せずにビルド成功します。 実際にそのライブラリをリンクして実行ファイルを作る際に、初めてシンボルが解決できればよいのです。 で、以下は状況が断定しかねるの憶測交じりになりますが、かなりDLLの感覚に引っ張られていませんか。 もしかして、bbb.libやccc.libにそれぞれddd.libを指定していませんか。 最終的にaaa.libひとつで公開したいのならそのリンクは不要というか余計です。はずしてください。 スタティックライブラリ内の.objは、VC付属のlib.exe(ライブラリアン)等で確認できまます。 一覧表示などしてみてください。 言ってしまえば今回の場合、これを確認しながら、最終的にすべての.objがひとつだけリンクされるように 各ライブラリを組み合わせてあげれば、aaa.libの完成です。 スタティックリンクする場合、中間のライブラリには依存するライブラリをリンクする必要がありません。 「静的にリンクする」ということはそのライブラリ内のobjを取り込んでしまうということです。 bbb.libやccc.libにddd.libを静的リンクしてしまうと、それぞれにddd.lib内の.objが含まれてしまいますので、 aaa.lib作成の際にそれらが警告を出すでしょう。 普通、スタティックなライブラリ同士をリンクすることも稀だと思います。 # 今回のように、配布用などにまとめたいときくらい? aaa.libだけを公開したいのであれば、bbb.libやccc.libにddd.libをリンクする必要はありません。 (DLLのように依存関係のライブラリをリンクする意味はありません) ということで、bbb.lib、ccc.lib、ddd.libを個別に作成し、aaa.libに直接、ひとつずつリンクしてください。

goopon
質問者

お礼

ありがとうございます。かなり参考になりました。 かなりDLLの感覚に引っ張られていました。 最終的に.obj1つずつまとめた塊と思えば、かなり頭で整理できました。 妙だったのが、VC7.0でビルドの順番を変えたいがために、依存関係を指定していたのですが、そうするとLNK4006のエラーが出ていたことです。 普通にひとつずつビルドしていくと通るので、依存関係を指定することでリンクして取り込もうとするんでしょうかね?? とりあえず解決したようです。ありがとうございました。

その他の回答 (3)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

bbb.libやccc.libに直接ddd.libをリンクせず、 必要に応じてbbb.libとddd.libをリンクするのが定石かと。 # この時点で個別リンクする利点/意味ってないような。 最終的に、aaa.libだけを提供したいということなので、 ・bbb.libやccc.libではddd.libをリンクしない ・aaa.libを作成する際にbbb.lib,ccc.lib,ddd.libをリンクしてaaa.libを作成する。 とするのがよさそうです。

goopon
質問者

補足

さらに回答ありがとうございます。 もともとDDLで作成してて、スタティックにしようとしたところ、こういう構成になりました。 というのも、bbb.libもccc.libもddd.libをリンクしないと動作しなかったためです。 でもスタティックだとそうしなくとも良いのですね。 早速試してみました。するとちょっと妙な感じなんですが・・・。 bbb.libで使用してるddd.libの関数と、ccc.libで使用しているddd.libがaaa.libでリンクするときに同様のwarningが発生します。 また、aaa.libで依存ファイルの設定にddd.libを設定しなくともリンクできているようです。 コードから自動的にリンクする機能がデフォルトであるとか??

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

あ、ddd.libが同一でも、 ddd.libでグローバル変数を互いに操作している場合、 予期しない衝突の可能性もあります。ご注意を。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

その警告は、「同じものが重複していたので、最初の物を使った」という通知です。 (順番はリンカへの指定による) 二つのddd.libがまったく同一のものなら、 最初の方が使われただけのことなので無視してかまいません。 もしも、ふたつのddd.libが別物で互換性がないならば、 後の方のddd.libを使おうと思っていたライブラリ(bbb or ccc)は、 予期せぬライブラリの関数を呼び出しますから、おかしくなる可能性が高いです。 # これを予防するための警告です。 この場合、ddd.libを同じものにして作り直さない限り、スタティックリンクライブラリはうまく動きません。 作り直すか、DLLを検討することになります。

goopon
質問者

お礼

早速の回答ありがとうございます。 ddd.libは同じもので作っています。 それでも警告は出てしまうんですね。 警告の数がものすごいことになっているのですが、警告自体を消すことは可能でしょうか??

関連するQ&A

  • CLapack C++

    現在、C言語の中で疑似逆行列を用いた最小2乗法によって データの処理を行いたいと考えています。 そのためにCLapackという線形演算ライブラリを visual studio 6.0に組み込みたいのですがうまくいきません。 研究で、ADボードやロボットマニピュレータを使うために  Win32 Application で自分でプログラムを書いています。 Win32 Console Application にCLapackを組み込む事は、 http://www.alab.t.u-tokyo.ac.jp/~bond/doc/clapack.html​ を見てうまくいったのですが、Win32 Applicationで組み込もうとすると、以下のようなエラーがでます。 リンク中... LINK : warning LNK4049: ローカル定義のシンボル "_free" がインポートされました LINK : warning LNK4049: ローカル定義のシンボル "_fprintf" がインポートされました LINK : warning LNK4049: ローカル定義のシンボル "__iob" がインポートされました LINK : warning LNK4049: ローカル定義のシンボル "_malloc" がインポートされました LINK : warning LNK4049: ローカル定義のシンボル "_exit" がインポートされました clapack.lib(dlamch.obj) : error LNK2001: 外部シンボル "__imp__printf" は未解決です clapack.lib(xerbla.obj) : error LNK2001: 外部シンボル "__imp__printf" は未解決です Debug/test.exe : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー プログラムに関する知識が乏しいため、解決できません。 またmath.hをインクルードすると大量のエラーがでます。 CLapackについて詳しい方がいらっしゃいましたら、 どうか教えていただけないでしょうか? よろしくお願いします。

  • VC++でビルド時の、リンク警告 LNK4006、LNK4221 を消したい

    こんにちは。 先週から仕事で Visual Stadio 2005 を使用して、C言語 でプログラムを書いています。 コードをビルドする際、ライブラリ作成時に以下の警告がでます。 1>Dynamic_02.lib(Dynamic_02.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR は Dynamic_01.lib(Dynamic_01.dll) で定義されています。2 つ目以降の定義は無視されます。 1>Dynamic_02.lib(Dynamic_02.dll) : warning LNK4221: パブリック シンボルが見つかりませんでした。アーカイブ メンバにアクセスできません。 これらの警告を消す方法はないですか? 以下は手順の詳細です。 1. 動的リンクライブラリ、Dynamic_01.dll を作成した。 同時にインポートライブラリ Dynamic_01.lib が作成される。 2. 動的リンクライブラリ、Dynamic_02.dll を作成した。 同時にインポートライブラリ Dynamic_02.lib が作成される。 3. Dynamic_01.dll と Dynamic_02.dll の両方の関数を使用する、 静的リンクライブラリ、Static_01.lib の作成を試みた。 追加の依存関係に Dynamic_01.lib と Dynamic_02.lib を指定し、 Static_01.lib をビルドすると、上記の警告が表示される。

  • DXライブラリ3D導入方法

    Visual C++ 2008使用 DXライブラリ3D導入時に下記のビルドエラーが発生します。 --------------------------------------------------------------- リンクしています... DxLibAd.lib(mL_Sound.obj) : error LNK2001: 外部シンボル "_CLSID_DirectMusicPerformance" は未解決です。 DxLibAd.lib(mL_Sound.obj) : error LNK2001: 外部シンボル "_IID_IDirectMusicPerformance8" は未解決です。 DxLibAd.lib(mL_Sound.obj) : error LNK2001: 外部シンボル "_CLSID_DirectMusicLoader" は未解決です。 DxLibAd.lib(mL_Sound.obj) : error LNK2001: 外部シンボル "_IID_IDirectMusicLoader8" は未解決です。 DxLibAd.lib(mL_Sound.obj) : error LNK2001: 外部シンボル "_CLSID_DirectMusicSegment" は未解決です。 DxLibAd.lib(mL_Sound.obj) : error LNK2001: 外部シンボル "_IID_IDirectMusicSegment8" は未解決です。 DxLibAd.lib(mL_Sound.obj) : error LNK2001: 外部シンボル "_GUID_StandardMIDIFile" は未解決です。 LIBCMTD.lib(wincrt0.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。 C:\Documents and Settings\ABC\デスクトップ\test\Debug\test.exe : fatal error LNK1120: 外部参照 8 が未解決です。 ---------------------------------------------------------------- 下記URLに同様の問題に関する質問が投稿されていたのですがVS2005のようですので解決できませんでした。 またリンクが正しくない、といった内容の記述を見かけたのですがリンクの方法がわかりません。 解答お願いします。 参考にさせていただいたサイト http://fatalita.sakura.ne.jp/3DLib/Install/LIB/index.html http://fatalita.sakura.ne.jp/CGI/3DLib2/read.cgi?no=11

  • 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 等のエラーになります。 解決策を教えてください。

  • CLIでのライブラリのリンク方法について

    VS2003のManagedC++では簡単にすることができたネイティブなライブラリを、VS2005のC++/CLIで利用することができません。 VS2003では、ファイルのインクルード、インクルードパスの追加、ライブラリのリンク、ライブラリパスの追加を行うと正しくリンクすることができたライブラリを、同じ方法でリンクしようとすると、VS2005ではコンパイルに失敗します。 ネイティブなライブラリをリンクするので、/clr:pureモードではなく、/clrモードにすればできると思い、試してみたのですが、 error LNK1314: COFF シンボル テーブルが壊れているか、または無効です。未定義のスタティック シンボルまたはラベル シンボルです。 というエラーが起きてコンパイルすることができません。 clrモードのほかに何か設定すべき項目があるのでしょうか。

  • ライブラリファイルのリンク (リリースバージョン時)

    VisualC++ 2005 Express Editionでライブラリファイル(.lib)をリリースバージョンでビルトし、違うプログラム(デバックバージョン)でライブラリファイルをリンクしたとき 1>コンパイルしています... 1>main.c 1>リンクしています... 1>CheckMemory.lib(check_memory.obj) : MSIL .netmodule または /GL を伴ってコンパイルされたモジュールが見つかりました。/LTCG を使用して再開始してください。リンカのパフォーマンスを向上させるためには、コマンドラインに /LTCG を追加してください。 1>LINK : warning LNK4075: /INCREMENTAL は /LTCG の指定によって無視されます。 1>LINK : warning LNK4098: defaultlib 'MSVCRT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 と出るのですが、これはどうゆうことなのでしょうか? 分かる方いらっしゃいますか?お願いします。 ちなみにライブラリファイルは簡易メモリチェックプロブラムでデバック時のみ使用したいと考えているプログラムです。 使用言語はc言語です。 文章下手ですみません^^;

  • 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を指定するところが特に無いのですが、どこかで指定しないといけないのでしょうか? よろしくお願いします。

  • シンボルに@n接尾辞がついているライブラリへのリンク(Fortran)

    インテル fortran Windows版 ver.11を使用しています。 あるライブラリを使用したf90のプログラムをビルドしようとしています。 コンパイルは通っているのですが、 リンクする際にシンボルが見つからずにリンクエラーとなってしまいます。 call func(varA, varB) のソース二対して、 LNK2019: 未解決の外部シンボル_FUNCが参照されました。 というような具合です。 ライブラリの中身を見てみると(nmコマンド) _FUNC@8 のようなシンボルが定義されているのですが、 一方でインテルコンパイラは _FUNC というシンボルを検索しているので未解決となってしまっているようです。 インテルのコンパイラオプション等でこのような@nの接尾辞がついたシンボルを 正しく検索、リンクできるようにする方法はないでしょうか? (サブルーチン名に@8を含めてしまうというのも一つの手段ですが、 @が予約語であるため、サブルーチン名に使用することができません。) ご存じの方がいらっしゃいましたら、ご教授いただけば幸いです。 よろしくお願いいたします。

  • EXCELで行の先頭データが同じ行の削除方法について

    EXCELで次のようなことをしたいのですがどうしたら簡単にできるでしょうか?  AAA   AAA  AAA  AAA  AAA  BBB  BBB  BBB  CCC  DDD  DDD  DDD  DDD 上ようのなデータで重複している部分を削除し、  AAA  BBB  CCC  DDD としたいのですが。 今は一行々々で確認しながら削除してます。3000行程あり困ってます。 どうしたら簡単にできるでしょうか?  

  • 静的リンクライブラリについて

    WindowsのライブラリにDLLやLIBといった形式があり、それぞれ「動的リンクライブラリ」「静的リンクライブラリ」となっていますが、 静的リンクライブラリとしてビルドされたライブラリを、動的に実行プログラムにリンクさせることは(Cやアセンブラなどの)実装次第で可能なのでしょうか? ビルド時にリンカがやってくれてることを実行時に行えればOK・・・という素直な話ではないのでしょうか。DLLも実行時にGetProcAddress()などを使ってアドレス解決をするわけですし、LIBでも同じことをするのは不可能ではないのでは?と思ったのです。 ※動的/静的リンクの概念や具体的な使用方法などはネット上で調べることができましたが、中身にまで踏み込んだ解説をしているページには巡り合えませんでした。そういう具体的な解説のあるページの紹介だけでもとても助かります。また、「根本的に思い違いをしてるんでは?」というご指摘も非常に助かります。 ※私自身↑に対する需要はないのでコスト・メリットとかは度外視です。興味本位というやつです。 ※別段、Windowsやライブラリの形式にこだわりがあるわけではないですが、これが一番メジャーだろう、ということでWindowsのDLL/LIBを対象に質問させて頂きました。 よろしくお願いします。

専門家に質問してみよう