6

我正在构建一个项目,其最终输出是一个静态库,我的基于 CMake 的构建系统包含两个子目录 - Src 和 Tests - 测试构建在其中生成可执行文件并将其链接到构建的库来自 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

CMake 应该能够自动找出 Src 和 Tests 之间的依赖关系,当然前提是您只在根 CMakeLists.txt 上调用 CMake。你真的不需要 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,然后进入测试目录并调用“make”或“msbuild”。

于 2012-10-15T08:50:02.597 回答