私は、複数のライブラリターゲットと1つの実行可能なターゲットに分割されたC++プロジェクトを持っています。私はこれらのライブラリを動的にリンクしていますが、静的リンクに切り替えることを試みていますが、「未定義参照」エラーが発生しています。必要なオブジェクトファイルをロードしていません
これらのエラーの1つに、影という名前のライブラリにあるEffectという名前のクラスが含まれていました。ライブラリのタイポグラフィには、Type_Effectという名前のクラスがあります。これは、Effectから派生したものです。タイポグラフィを処理するとき、リンカはEffectクラスのシンボルを見つけることができません。私はシェーディングのための出力の-verboseコマンドやパートを有するリンカーを走った
.../shading/libshading.a .../typography/libtypography.a ...
た:
私は図書館がそうのように含まれていることを確認し
attempt to open .../shading/libshading.a succeeded
(.../shading/libshading.a)Shader_Manager.cpp.obj
(.../shading/libshading.a)Shader.cpp.obj
(.../shading/libshading.a)Program.cpp.obj
Effect.cpp .objが見つかりませんでした。私はshading.aファイルをチェックし、それにはEffect.cppとすべての関連するエフェクトシンボルが含まれていました。次に、私は私のメインの実行のcppファイルにエフェクトオブジェクトを作成するためのダミーのコードを追加し、確かにリンカ出力は現在含ま:
([...]/shading/libshading.a)Effect.cpp.obj
を別の方法として、--whole-archive
とlinklibs.rspを先行Effect.cppをロードするようにリンカに強制します.objしかし、すべてをロードすると、この問題の範囲を超えて他の問題が発生します。
証拠は、どのオブジェクトファイルを含めるべきかを決定するリンカのいくつかの故障を指摘しています。シェーディングライブラリは主な実行可能ファイルのターゲットでは直接使用されないため、ロードされているシェーダオブジェクトが存在すると、依存関係のトレースの少なくとも一部が機能していることが示されます。 --whole-archive
用LDフラグのドキュメントで
には、どのように言及している[s]のリンクでアーカイブ内のすべてのオブジェクトファイルを、必要なオブジェクトファイルのアーカイブを検索するのではなく 。
検索の背後にある論理は何ですか。どのような要因がそれを作り、壊すことができますか?
これはその質問の重複ではありません。それは反対です。質問は症状について質問し、答えはその症状の原因についてです。リンクされた質問は原因を尋ね、答えは症状をリストします。私の目の前にだけ症状があったので、すでに答えがわからない限り、リンクされた質問を見つける方法はありませんでした。 – silentorb
*は既に私の質問に対する答えを知っていた – silentorb