インターフェイス ライブラリで構成されるレイヤーを含むプロジェクトがあります。
add_library(I INTERFACE)
これらのインターフェイス ライブラリは、アプリケーションのさまざまな環境に適合するように、数回実装されます。
add_library(IA STATIC ...)
target_link_libraries(IA PUBLIC I)
add_library(IB STATIC ...)
target_link_libraries(IB PUBLIC I)
インターフェイス ライブラリを利用する、アプリケーションに依存しないライブラリもあります。
add_library(Foo STATIC ...)
target_link_libraries(Foo PUBLIC I)
add_library(Bar STATIC ...)
target_link_libraries(Bar PUBLIC I)
最後に、アプリケーションは、使用されているインターフェイス ライブラリ レイヤーの実装を定義します。
add_executable(ExeA ...)
target_link_libraries(ExeA Foo Bar IA)
add_executable(ExeB ...)
target_link_libraries(ExeB Foo Bar IB)
幸いなことに、合成リンク コマンドの後にIA
リストされている限り、これは問題ありません。Foo
Bar
ただし、I の特定の実装では、アプリケーションに依存しないライブラリを再度使用します。これらの環境では、リンク コマンド ラインは次のようになります。
IA Foo Bar
あるべきなのに
Foo Bar IA Foo Bar
Foo
/コンパイル中Bar
に依存する明示的な依存関係が記述されていないため、これは理にかなっています。IA
ExeA
target_link_libraries
単純なケースでは、リンク コマンド ラインが呼び出しと同じ順序になるのがデフォルトであるため、幸運です。
gcc-arm-none-eabi クロスコンパイラを使用しています。これが私が試したことです:
LINK_INTERFACE_MULTIPLICITY
動作しないようです。生成されたコマンド ラインは、数値が高くても同じです。
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--start-group")
リンクは成功しますが、プログラムはターゲット ハードウェアで正しく実行されません。デバッガーを接続してリセットするだけで実行されます。奇妙な振る舞い。
の代わりに
Foo
/Bar
を明示的にリンクすると、コマンド ラインがになり、すべて正常に動作します。しかし、私はこれを一般的に行うことはできません.IA
--start-group
Foo Bar IA Foo Bar
ExeB
- ExeA のコンパイル中に Foo / Bar が一時的に IA に依存し、ExeB のコンパイル中に一時的に IB に依存するように定義する方法はありますか?
- 上記のような構造のプロジェクトを処理する方法について、別のアプローチはありますか?