2012-10-14 33 views
2

我正在构建一个项目,其最终输出是一个静态库,而我的基于CMake的构建系统由两个子目录组成--Src和Tests--其中为测试构建一个可执行文件并将其链接到由src构建的库。链接到尚未用CMake构建的库

我的问题是,测试版本需要库已经存在,如果它继续没有任何错误。有没有一种方法可以让CMake明白,当开始构建测试时库会存在,还是必须通过单独的步骤来完成这些工作?

我的CMakeLists.txt文件,如下:

Root文件:

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) 
+3

为什么你需要一个明确的mylib find_library?除非你有一些额外的要求,否则它不是必需的。你可以直接指定target_link_libraries(测试mylib)。这样CMake就会知道测试依赖于mylib,并且会确保在开始构建测试之前构建mylib。 –

+0

它能够在并行目录中找到mylib吗?我只在Src中定义它,并且测试构建文件不知道它。这会是一个问题吗? –

+0

但是你的父CMakeLists知道两个目标(通过add_subdirectory)。当然,你应该只在你的根文件上调用cmake,而不要单独在测试上。我将创建一个答案来反映我的意见。 –

回答

3

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) 

如果你想打造“测试”只是,我建议你打电话上的CMake根CMakeLists.txt,然后进入测试目录并调用'make'或'msbuild'。

+0

非常感谢您的回答:) –