将 GTest 与现有的 CMake 项目集成:共享相同 target_sources
Integrating GTest with existing CMake Project: share the same target_sources
我有一个很大的 C++ 库,想用 GTest 做一些测试。
目前,构建是用 CMake 处理的,特别是在根目录中有一个 CMakeLists.txt 文件,如下所示
make_minimum_required(VERSION 3.13.0)
project(mylib)
find_package(PkgConfig REQUIRED)
set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
set(CMAKE_INSTALL_RPATH "${CMAKE_CURRENT_SOURCE_DIR}/lib/protobuf/src/.libs/")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
SET(BASEPATH "${CMAKE_SOURCE_DIR}")
INCLUDE_DIRECTORIES("${BASEPATH}")
add_executable(mylib run.cpp)
add_subdirectory(src)
add_subdirectory(proto)
target_include_directories(mylib PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/lib/math
${CMAKE_CURRENT_SOURCE_DIR}/lib/protobuf/src
... some dirs ...
)
target_link_directories(mylib PRIVATE
... some libs ..
)
target_link_libraries(mylib
${CMAKE_CURRENT_SOURCE_DIR}/lib/math
${CMAKE_CURRENT_SOURCE_DIR}/lib/protobuf/src
.....
)
target_compile_options(mylib PUBLIC -D_REENTRANT -fPIC)
然后在src目录和每个子目录下都有一个CMakeLists.txt文件,比如这个在src/
target_sources(mylib
PUBLIC
includes.hpp
)
add_subdirectory(algorithms)
add_subdirectory(collectors)
add_subdirectory(hierarchies)
add_subdirectory(mixings)
add_subdirectory(runtime)
add_subdirectory(utils)
我的问题如下:在当前项目中集成GTest的痛苦最小的方法是什么?我正在考虑拥有一个 test/ 子目录,就像我在这里看到的那样:
但是,此示例要求您为每个可执行文件手动列出它包含的所有文件。有没有更快的方法来使用已经添加到 'mylib' 的源?
您可以将当前的 mylib 可执行目标拆分为两个目标
- mylib,一个与当前 mylib 目标非常相似的库目标,但没有 run.cpp 文件
- mylib_exe 将 run.cpp 和 link 编译为 mylib
的可执行目标
现在您的测试文件可以 link 到 mylib。
我有一个很大的 C++ 库,想用 GTest 做一些测试。 目前,构建是用 CMake 处理的,特别是在根目录中有一个 CMakeLists.txt 文件,如下所示
make_minimum_required(VERSION 3.13.0)
project(mylib)
find_package(PkgConfig REQUIRED)
set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
set(CMAKE_INSTALL_RPATH "${CMAKE_CURRENT_SOURCE_DIR}/lib/protobuf/src/.libs/")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
SET(BASEPATH "${CMAKE_SOURCE_DIR}")
INCLUDE_DIRECTORIES("${BASEPATH}")
add_executable(mylib run.cpp)
add_subdirectory(src)
add_subdirectory(proto)
target_include_directories(mylib PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/lib/math
${CMAKE_CURRENT_SOURCE_DIR}/lib/protobuf/src
... some dirs ...
)
target_link_directories(mylib PRIVATE
... some libs ..
)
target_link_libraries(mylib
${CMAKE_CURRENT_SOURCE_DIR}/lib/math
${CMAKE_CURRENT_SOURCE_DIR}/lib/protobuf/src
.....
)
target_compile_options(mylib PUBLIC -D_REENTRANT -fPIC)
然后在src目录和每个子目录下都有一个CMakeLists.txt文件,比如这个在src/
target_sources(mylib
PUBLIC
includes.hpp
)
add_subdirectory(algorithms)
add_subdirectory(collectors)
add_subdirectory(hierarchies)
add_subdirectory(mixings)
add_subdirectory(runtime)
add_subdirectory(utils)
我的问题如下:在当前项目中集成GTest的痛苦最小的方法是什么?我正在考虑拥有一个 test/ 子目录,就像我在这里看到的那样:
但是,此示例要求您为每个可执行文件手动列出它包含的所有文件。有没有更快的方法来使用已经添加到 'mylib' 的源?
您可以将当前的 mylib 可执行目标拆分为两个目标
- mylib,一个与当前 mylib 目标非常相似的库目标,但没有 run.cpp 文件
- mylib_exe 将 run.cpp 和 link 编译为 mylib 的可执行目标
现在您的测试文件可以 link 到 mylib。