2016-09-01 8 views
0

私は、複数のライブラリターゲットと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]のリンクでアーカイブ内のすべてのオブジェクトファイルを、必要なオブジェクトファイルのアーカイブを検索するのではなく

検索の背後にある論理は何ですか。どのような要因がそれを作り、壊すことができますか?

+0

これはその質問の重複ではありません。それは反対です。質問は症状について質問し、答えはその症状の原因についてです。リンクされた質問は原因を尋ね、答えは症状をリストします。私の目の前にだけ症状があったので、すでに答えがわからない限り、リンクされた質問を見つける方法はありませんでした。 – silentorb

+0

*は既に私の質問に対する答えを知っていた – silentorb

答えて

1

静的リンクの場合、ldは、以前にロードされたオブジェクトファイルから知っている未解決のシンボルに対する定義がオブジェクトファイルに含まれている場合にのみ、オブジェクトファイルをアーカイブからロードします。

Why does the order in which libraries are linked sometimes cause errors in GCC?

従って、LD入力は、依存関係に依存注文する必要があります。タイポグラフィー・ライブラリーは、シェーディング・ライブラリーの前にリストされる必要がありました。私はそれを後方に持っていた。

関連する問題