スタティックリンクライブラリで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を使用してます。
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に直接、ひとつずつリンクしてください。
ありがとうございます。かなり参考になりました。
かなりDLLの感覚に引っ張られていました。
最終的に.obj1つずつまとめた塊と思えば、かなり頭で整理できました。
妙だったのが、VC7.0でビルドの順番を変えたいがために、依存関係を指定していたのですが、そうするとLNK4006のエラーが出ていたことです。
普通にひとつずつビルドしていくと通るので、依存関係を指定することでリンクして取り込もうとするんでしょうかね??
とりあえず解決したようです。ありがとうございました。
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を作成する。
とするのがよさそうです。
この回答への補足
さらに回答ありがとうございます。
もともとDDLで作成してて、スタティックにしようとしたところ、こういう構成になりました。
というのも、bbb.libもccc.libもddd.libをリンクしないと動作しなかったためです。
でもスタティックだとそうしなくとも良いのですね。
早速試してみました。するとちょっと妙な感じなんですが・・・。
bbb.libで使用してるddd.libの関数と、ccc.libで使用しているddd.libがaaa.libでリンクするときに同様のwarningが発生します。
また、aaa.libで依存ファイルの設定にddd.libを設定しなくともリンクできているようです。
コードから自動的にリンクする機能がデフォルトであるとか??
No.1
- 回答日時:
その警告は、「同じものが重複していたので、最初の物を使った」という通知です。
(順番はリンカへの指定による)
二つのddd.libがまったく同一のものなら、
最初の方が使われただけのことなので無視してかまいません。
もしも、ふたつのddd.libが別物で互換性がないならば、
後の方のddd.libを使おうと思っていたライブラリ(bbb or ccc)は、
予期せぬライブラリの関数を呼び出しますから、おかしくなる可能性が高いです。
# これを予防するための警告です。
この場合、ddd.libを同じものにして作り直さない限り、スタティックリンクライブラリはうまく動きません。
作り直すか、DLLを検討することになります。
早速の回答ありがとうございます。
ddd.libは同じもので作っています。
それでも警告は出てしまうんですね。
警告の数がものすごいことになっているのですが、警告自体を消すことは可能でしょうか??
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux AWSのEC2のZabbixユーザーでawscliコマンドが実行できない状態を解決する 1 2022/12/06 22:17
- Perl Perl の外部モジュールの利用方法 3 2022/07/10 18:34
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- その他(プログラミング・Web制作) python flask から fastapiへの移行時のエラー対処 1 2023/02/05 12:26
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
- Ruby Ruby / passenger のインストールについて 1 2023/01/30 18:31
- PostgreSQL PostgreSQLで"pg_dumpall -f data.sql"を使ってバックアップしたデータ 2 2022/09/19 08:14
- PHP jpgraphで表示されない 2 2022/10/22 09:12
- 物理学 物理の電磁気で質問なんですけど、写真のような磁場中の斜面上にある導体棒の問題についてです。まず条件と 2 2023/07/25 09:47
- Ruby 教えてください 2 2023/01/04 17:50
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
VC++でビルド時の、リンク警告 LNK4006、LNK4221 を消したい
C言語・C++・C#
-
2重定義って??
C言語・C++・C#
-
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
-
4
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
5
多重定義が起きている?--lnk2005エラー:VC++
C言語・C++・C#
-
6
C/C++の.libについて教えてください。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++によるPostgreSQLの接続
-
fatal error LNK1104: ファイル...
-
スタティックライブラリ関係の...
-
スタティックリンクライブラリ...
-
VS2010にて、依存関係とビルド順
-
visual studio community2017 O...
-
gdi+ LNK1103
-
VB6/SPREAD6.0 について
-
Visual Studio 2022の『#define...
-
'stdafx.h'のエラーに関して
-
OpenSSLの共有ライブラリ(libcr...
-
インポートライブラリ(.lib)フ...
-
WindowsにおけるPostgreSQL+C言...
-
exeファイルはどのdllを参照す...
-
mac(osX)で、Javaはどこにイン...
-
cvSnakeImageの定義の方法を教えて
-
C++Builder リンカエラーとは?
-
python エラー
-
エクセルのエラーメッセージ「4...
-
<unistd.h>をVisualStudioでつ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スタティックライブラリ関係の...
-
visual studio community2017 O...
-
【VS2008 C++】2つのプロジェ...
-
fatal error LNK1104: ファイル...
-
#pragma commentの相対パス指定
-
VC++でビルド時の、リンク警告 ...
-
LTspice モデル作成について
-
'd3dx9.lib' が開けません。
-
VC++6.0からVC++.NET2005へ移植
-
「MFCを使用しない」から「MFC...
-
error LNK2019: 未解決の外部シ...
-
dllかlibか
-
error LNK2001: 外部シンボル "...
-
lvwReport/エラー/プロジェクト...
-
mac(osX)で、Javaはどこにイン...
-
'stdafx.h'のエラーに関して
-
ShellExecute関数について(初...
-
C++Builder リンカエラーとは?
-
#include <winreg.h>をインクル...
-
C++によるPostgreSQLの接続
おすすめ情報