3

cmake 2.8.1 を使用して Linux 環境で CMake を使用しています。同じ結果でcmake 2.8.7も試しました。

アーカイブ (静的ライブラリ) に対して特別な調整を行う必要があります。これは、cmake custom_command として実行されます。その結果、実行可能ファイルのリンクで使用する必要がある新しいアーカイブが作成されます。条件付けの入力アーカイブも cmake ターゲットです。

必要なのは、アーカイブの条件付きバージョンと実行可能ファイルの間の依存関係です。add_dependencies を使用しても機能せず、その理由がわかりません。

cmake のその動作を示す例を作成しました。この例には、2 つの C ファイルが含まれています。1 つはアーカイブ用で、もう 1 つは main() を含んでいます。簡単なアーカイブの調整として、以前に生成されたアーカイブのコピーを作成するだけです。

2 つのソース ファイルは次のとおりです。

main.c:

int myPrint(void);

int main(void)
{
  myPrint();
}

mylib.c:

#include <stdio.h>

int myPrint(void)
{
  printf("Hello World\n");
}

これは私が作成した CMakeLists.txt です:

cmake_minimum_required(VERSION 2.8)

project(cmake_dependency_test)

add_library(mylib STATIC mylib.c)

add_custom_command(OUTPUT libmylib_conditioned.a
                   COMMAND cp libmylib.a libmylib_conditioned.a
                   DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libmylib.a
                   COMMENT "Conditioning library")
add_custom_target(conditioning DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libmylib_conditioned.a)
add_dependencies(conditioning mylib)

add_executable(cmake_dependency_test main.c)
add_dependencies(cmake_dependency_test conditioning)
target_link_libraries(cmake_dependency_test -L. mylib_conditioned)

まず、アーカイブ mylib を作成します。add_custom_command を使用して条件付けを行い、add_custom_target は条件付けされたアーカイブの最上位のターゲットを提供します。条件付きアーカイブをビルドする前に入力アーカイブを更新する必要があるため、入力アーカイブの最上位ターゲットと条件付きアーカイブの最上位ターゲットの間に依存関係を追加しました。これは完璧に機能します!mylib.c に触れて make Conditioning を実行すると、入力アーカイブがビルドされ、その後、条件付きアーカイブがビルドされます。

Ok。ここで、条件付きアーカイブをリンクに使用します。実行可能ファイルから条件付きアーカイブへの依存関係を持たせるために、もう一度 add_dependencies を使用しました。ただし、ライブラリ ソース mylib.c に触れてから make を実行しても、期待どおりに実行可能ファイルが更新されません。

CMakeLists.txt のどこが間違っていますか?

4

1 に答える 1

2

ターゲット cmake_dependency_test のターゲット プロパティ LINK_DEPENDS の設定を試みることができます

...
add_executable(cmake_dependency_test main.c )  
set_property(TARGET cmake_dependency_test PROPERTY LINK_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libmylib_conditioned.a)  
add_dependencies(cmake_dependency_test conditioning mylib)
target_link_libraries(cmake_dependency_test -L. mylib_conditioned)
于 2013-01-21T10:01:16.043 に答える