1

インターフェイス ライブラリで構成されるレイヤーを含むプロジェクトがあります。

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リストされている限り、これは問題ありません。FooBar

ただし、I の特定の実装では、アプリケーションに依存しないライブラリを再度使用します。これらの環境では、リンク コマンド ラインは次のようになります。

IA Foo Bar

あるべきなのに

Foo Bar IA Foo Bar

Foo/コンパイル中Barに依存する明示的な依存関係が記述されていないため、これは理にかなっています。IAExeA

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-groupFoo Bar IA Foo BarExeB


  • ExeA のコンパイル中に Foo / Bar が一時的に IA に依存し、ExeB のコンパイル中に一時的に IB に依存するように定義する方法はありますか?
  • 上記のような構造のプロジェクトを処理する方法について、別のアプローチはありますか?
4

0 に答える 0