9

MQX OS (CodeWarrior を使用) に基づくアプリケーションをビルドするために、CMake 2.8 を使用しています。
CMake プロジェクトは基本的に一連の静的ライブラリ (LIB1 と LIB2 としましょう) を構築します。
次に、最終的な実行可能な cmake ルールでこれらのライブラリを参照します。

target_add_executable(X ${some_sources})
target_link_libraries(X LIB1 LIB2)

私の問題は、いくつかのシンボルが複数のライブラリで定義されていることです。
したがって、次のようなリンク コマンド:

mwldarm <args> -o <output> <objects> /path/to1/libLIB1.a /path/to2/libLIB2.a

シンボルの複数定義エラーが発生します。代わりに、CMake に次のようなリンク コマンドを生成してもらいたいと思います。

mwldarm <args> -o <output> <objects> -L/path/to1 -L/path/to2 -lLIB -lLIB2

質問: CMAKE から次の変数を取得するにはどうすればよいですか?

  • ライブラリ ディレクトリ フラグ (例: -L/path/to1 -L/path/to2)
  • ライブラリ リンク フラグ (例: -lLIB -lLIB2)

RPATH に関するものを読みましたが、共有ライブラリのみに関係しているようです。私は正しいですか?

よろしくお願いします。
感謝します。

4

3 に答える 3

3

ポリシーCMP0003が必要なようです。

それを使用するには、次の行を の先頭近くに追加しますCMakeLists.txt

CMAKE_POLICY( SET CMP0003 OLD )

別の可能性は、依存関係と検索パスを直接設定することですが、これは最もクリーンな方法ではありません。ライブラリが and と呼ばれると仮定するliba.alibb.a、次のようになります。

LINK_DIRECTORIES( ${paths_to_search_for} )
TARGET_ADD_EXECUTABLE(X ${some_sources} )
ADD_DEPENDENCIES(X LIB1 LIB2)
TARGET_LINK_LIBRARIES(X a b )

この場合a、 とbは cmake ターゲットではないことに注意してください。したがって、依存関係を正しく設定するには、少し機械が必要です。

于 2013-02-12T15:12:44.613 に答える
-1

CMP0003は公式ドキュメントにあるように、検索パスを自動で追加する機能のオン/オフを切り替えるために使用されていると思います。

フル パスでリンクされたライブラリは、リンカの検索パスを生成しなくなりました。

パス名を に置き換えるのではなく、-l.

ライブラリをリンクするとき、ライブラリが既知のターゲット CMake である場合、CMake は常に関連するオプションをライブラリのパス名に置き換え-Lます-l。これは、スタティック ライブラリをリンクする場合には問題にならない場合があります。しかし、実行可能ファイルが共有ライブラリをリンクする場合、問題になる可能性があります。-L次に、絶対パスではなく「-l」を使用してshreadライブラリをリンクする問題を解決するために、以下のようなコードのハッキング方法を見つけました。

# Find out the link.txt      
set(LINK_TXT "${CMAKE_BINARY_DIR}/${ToLinkLib}/CMakeFiles/${ToLinkLIb}.dir/link.txt")

# Add the searching path into link command
add_custom_command(TARGET ${YourTarget} PRE_BUILD
  COMMAND sed ARGS -ie "\"s;[[:blank:]]-l; -L${LIBRARY_OUTPUT_PATH} -l;\"" ${LINK_TXT}
  DEPENDS ${LINK_TXT}
  COMMENT "Hacking CMake: edit __link.txt__ to use -l instead of path to link internal library ...")

# NOTE: Dont't missing the `-l'. 
target_link_libraries(${YourTarget} -l${ToLinkLib})

もちろん、これは単なるハッキングであるため、CMake のすべてのバージョンでうまく動作しない可能性があります。


更新:共有ライブラリのリンクが問題になるのはなぜですか?

同じ CMake スクリプトで構築された共有ライブラリをリンクする、Android 用にクロス コンパイルされた実行可能ファイルを実行すると、リンクに失敗するという問題が発生しました。上記のハッキング方法を使用して新しいバージョンを取得した後、以下のようなコマンドで実行可能ファイルを実行できます

 $ LD_LIBRARY_PATH=. ./the_exe opts
于 2014-10-15T04:46:57.297 に答える