6

最終出力が静的ライブラリであるプロジェクトをビルドしています。私の CMake ベースのビルド システムは、Src と Tests の 2 つのサブディレクトリで構成されています。テスト用のビルドは実行可能ファイルを生成し、ビルドされたライブラリにリンクします。 srcから。

私の問題は、エラーなしで続行するには、テストビルドでライブラリが既に存在している必要があることです。テストをビルドするときにライブラリが存在することを CMake に理解させる方法はありますか、それとも別の手順で行う必要がありますか?

次のように私のCMakeLists.txtファイル:

ルート ファイル:

cmake_minimum_required( VERSION 2.8 )
project( mylib )
add_subdirectory( Src )
add_subdirectory( Tests )

ソースファイル:

file( GLOB MYLIB_SOURCES *.cpp )
add_library( mylib ${MYLIB_SOURCES} )

テストファイル:

file( GLOB MYLIB_TESTS *.cpp )
add_executable( tests ${MYLIB_TESTS} )

find_package( GTest REQUIRED )
find_library( LIB_MYLIB NAMES mylib PATHS "${CMAKE_SOURCE_DIR}/Build/Src" )

include_directories( ../Src )
include_directories( ${GTEST_INCLUDE_DIRECTORIES} )

target_link_libraries( tests ${LIB_MYLIB} ${GTEST_LIBRARIES} pthread )
4

1 に答える 1

6

もちろん、ルート CMakeLists.txt でのみ CMake を呼び出す場合、CMake は Src と Tests の間の依存関係を自動的に把握できるはずです。find_library は本当に必要ありません。

したがって、Src CMakeLists.txt を次のように保持します。「カプセル化」を増やすには、たとえば、そこに「MyLib_INCLUDE_DIRS」を設定して、強制的にキャッシュに入れることができます。

project( MyLib )
file( GLOB MYLIB_SOURCES *.cpp )
add_library( mylib ${MYLIB_SOURCES} )
# I do not know
set( mylib_INCLUDE_DIRS ${MyLib_SOURCE_DIR} CACHE STRING "Include-directories for MyLib" FORCE )

テスト CMakeLists.txt を書き換えます。

project( MyTests )
file( GLOB MYLIB_TESTS *.cpp )
add_executable( tests ${MYLIB_TESTS} )

find_package( GTest REQUIRED )
include_directories( ${mylib_INCLUDE_DIRS} )
include_directories( ${GTEST_INCLUDE_DIRECTORIES} )

target_link_libraries( tests mylib ${GTEST_LIBRARIES} pthread )

「テスト」のみをビルドする場合は、ルート CMakeLists.txt で CMake を呼び出してから、tests ディレクトリに移動して「make」または「msbuild」を呼び出すことをお勧めします。

于 2012-10-15T08:50:02.597 に答える