我正在构建一个项目,其最终输出是静态库,我的基于CMake的构建系统包含两个子目录 - Src和Tests - 其中测试的构建生成可执行文件并链接到库这是从src。
构建的我的问题是测试版本要求库已经存在,如果它要继续而没有任何错误。有没有办法让CMake了解库在构建测试时是否存在,或者我是否必须分别执行这些操作?
我的CMakeLists.txt文件如下:
根文件:
cmake_minimum_required( VERSION 2.8 )
project( mylib )
add_subdirectory( Src )
add_subdirectory( Tests )
Src档案:
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 )
答案 0 :(得分:5)
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,然后进入tests目录并调用'make'或'msbuild'。