2

私はCMakeが初めてです。プロジェクトをコンパイルしました。私はこのような構造を持っています

事業

  • SRC


    1. このフォルダーの .cpp (すべてのソース ファイル) と CMakeLists.txt をテストします (静的ライブラリを作成します)。

    2. .cpp (すべてのソース ファイル) とこのフォルダーの CMakeLists.txt (静的ライブラリの作成)
  • 含む

    1. test
      .h (すべてのヘッダー ファイル)
    2. example
      .h (すべてのヘッダー ファイル)
  • 建てる

    1. CMakeLists.txt (メインの CMakelist ファイル)
  • ライブラリ

    1. test (生成されたファイルを含む)
    2. 例 (生成されたファイルを含む)

問題は、すべての静的ファイルをコピーする方法です。テストとサンプルのフォルダーから、バイナリ構造の外の別のフォルダーに再帰的に配置しますか?

私のメインの CMakeLists.txt ファイル:

PROJECT(copythefiles)

SET(CMAKE_CURRENT_BINARY_DIR ".")

add_subdirectory(/src/test /lib/test) # I am specifying the location where the files are to be generated
add_subdirectory(/src/example /lib/example)

ADD_CUSTOM_TARGET( a ALL COMMAND ${CMAKE_COMMAND} -E echo "\{X}" > ${CMAKE_CURRENT_BINARY_DIR}/lib/test/libtest.a )

ADD_CUSTOM_COMMAND(TARGET a POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${CMAKE_CURRENT_BINARY_DIR}/lib/test/libtest.a
        ${CMAKE_CURRENT_BINARY_DIR}/lib/libtest.a )

これにより、ファイルがコピーされます。しかし、約 20 のプロジェクトがあり、再帰的に実行したいと考えています。

ありがとう :)

4

1 に答える 1

3

トップレベルの CMakeLists.txt ファイルがプロジェクトのルートにあるのは正常です。CMakeLists.txt を「/build」からルートに移動すると、add_subdirectoryケースごとにバイナリ パスを指定しなくても呼び出すことができるはずです。

CMakeLists ファイルを移動すると仮定すると、add_subdirectory呼び出しの前にこれを挿入できます。

function(MoveLib TheTarget)
  add_custom_command(TARGET ${TheTarget} POST_BUILD
                     COMMAND ${CMAKE_COMMAND} -E
                         copy $<TARGET_FILE:${TheTarget}> ${CMAKE_SOURCE_DIR}/lib)
endfunction()

execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_SOURCE_DIR}/lib)

MoveLib(my_test)これにより、たとえば、ライブラリの CMakeLists.txt ファイル内に追加できます。ここmy_testで、 は関係するライブラリの名前です。


すべてのライブラリのコピーは、最終的に「/lib」になります。本当にコピーが必要ない場合は、ARCHIVE_OUTPUT_DIRECTORYプロパティを確認する必要があります。単純に追加する場合

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib)

その後、すべての静的ライブラリは「/lib」になります。ただし、ここで注意すべき点がいくつかあります。

共有ライブラリは の対象外ARCHIVE_OUTPUT_DIRECTORYです。ただし、共有ライブラリの詳細はドキュメントにARCHIVE_OUTPUT_DIRECTORYあります。

また、一部のジェネレーター (MSVC など) は、指定されたディレクトリに構成ごとのサブディレクトリを追加するため、「/lib/Debug」、「/lib/Release」などになります。構成を設定することで、これを回避できます。 -すべての特定のバージョンは、次CMAKE_ARCHIVE_OUTPUT_DIRECTORYを指し${CMAKE_SOURCE_DIR}/libます:

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/lib)
于 2012-10-31T21:42:52.850 に答える