gpt4 book ai didi

带有具有冗余依赖项的子模块的 CMake 项目

转载 作者:行者123 更新时间:2023-12-01 01:53:44 24 4
gpt4 key购买 nike

我有以下项目结构:

root-project/
|-> CMakeLists.txt
|-> src/
|-> foo.cpp
|-> include/
|-> foo.hpp
|-> test/
|-> test_foo.cpp
|-> googletest/
|-> CMakeLists.txt
|-> ...
|-> libs/
|-> my-lib/
|-> CMakeLists.txt
|-> src/
|-> bar.cpp
|-> include/
|-> bar.hpp
|-> test/
|-> test_bar.cpp
|-> googletest/
|-> CMakeLists.txt
|-> ...
root-project构建一个名为 foo 的可执行文件这取决于库 my-lib . root-projectmy-lib使用 googletest用于测试,包含在 git-submodule 中.

我已经接受了我将有多余的 googletest 的事实。使用 git-submodule 的目录.但是,问题在于简单地使用 add_subdirectory连接整个项目最终会得到多个 gtest目标。

我的问题 : 有没有办法 root-project build my-lib并且只看到目标 my-lib而不是测试目标 googletest ? (即,冗余 googletest 可以在构建期间“隐藏”吗?)

我的第二个问题 :鉴于我的 CMake 新手身份,我是否以有缺陷的方式组织这些项目?有没有更喜欢的方式来组织避免这个问题的项目?欢迎一些 build 性的 CMake 建议!

最佳答案

我不确定这是否是这种情况下的最佳实践,但我最终在我的项目中所做的是编写一个 cmake 模块 gtest.cmake将 gtest 添加到我的项目中。在那个模块中,我检查它是否已经添加,如果是,我只是重用生成的 ${gtest_SOURCE_DIR}多变的:

CMakeLists.txt:

cmake_minimum_required(VERSION 3.3)
project(myProject CXX)

set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake")

include(gtest)

# myTarget definition

include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})
target_link_libraries(myTarget gtest gtest_main)

cmake/gtest.cmake:
if(gtest_SOURCE_DIR)
message(STATUS "gtest variables already defined. Skipping.")
else()
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/external/gtest")
endif()

编辑:
我对测试目标所做的通常是将它们从常规构建中排除,使用 EXCLUDE_FROM_ALL add_executable 的属性(property).您也可以将该标志用于 add_subdirectory这样,只有当您想运行测试时,您才能包含 gtest。例如,您可以在 CMakeLists.txt 中编写如下内容:
# set ${TESTS_SOURCE_FILES} with the source files of your tests

include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})
add_executable(${PROJECT_NAME}_tests EXCLUDE_FROM_ALL ${TESTS_SOURCE_FILES})

target_link_libraries(${PROJECT_NAME}_tests gtest gtest_main)

并拥有您的 cmake/gtest.cmake像这样写:
if(gtest_SOURCE_DIR)
message(STATUS "gtest variables already defined. Skipping.")
else()
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/external/gtest" EXCLUDE_FROM_ALL)
endif()

那么,只有当你 make通过运行 make myProject_tests 显式测试目标它只会构建成为测试目标所需的东西。

希望有帮助!

关于带有具有冗余依赖项的子模块的 CMake 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42182596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com