Лучшая практика для включения библиотек C ++ в мой проект - PullRequest
0 голосов
/ 05 сентября 2018

Я сталкиваюсь с некоторыми проблемами, связанными с обработкой проектов C ++. У меня есть набор репозиториев, которые все отслеживаются с помощью git (размещено на gitlab).

  • repo_A: мой текущий проект
  • repo_B: библиотека, которую я создал и должен использовать в repo_A

Какую наилучшую практику следует включать repo_B в repo_A? .

  1. Установка repo_B на системном уровне? А затем используйте repo_B из repo_A, используя CMakelists
  2. Добавление repo_B в качестве подмодуля на repo_A
  3. Добавление его в списки CMakeLists с использованием чего-то похожего на то, что объясняется в googletest репозитории

    cmake_minimum_required(VERSION 2.8.2)
    
    project(googletest-download NONE)
    
    include(ExternalProject)
    ExternalProject_Add(googletest
    GIT_REPOSITORY    https://github.com/google/googletest.git
    GIT_TAG           master
    SOURCE_DIR        "${CMAKE_BINARY_DIR}/googletest-src"
    BINARY_DIR        "${CMAKE_BINARY_DIR}/googletest-build"
    CONFIGURE_COMMAND ""
    BUILD_COMMAND     ""
    INSTALL_COMMAND   ""
    TEST_COMMAND      ""
    )
    

Мы были оригинальными библиотеками на уровне пользователя. Однако после начала использования Jenkins мы сталкиваемся с некоторыми проблемами.

1 Ответ

0 голосов
/ 05 сентября 2018

Лучшим вариантом будет своего рода смешанная версия. Я обычно отслеживаю внешние библиотеки как подмодули git (в PROJECT_ROOT / submodules) и создаю общий файл CMake для всех них, например:

find_package(GTest)

if(GTEST_FOUND)
  message(STATUS "googletest was found!")
else()
  message(STATUS "googletest was not found, local build is needed!")

  include(ExternalProject)

  ExternalProject_Add(googletest-project
    URL ${CMAKE_SOURCE_DIR}/submodules/googletest/
    PREFIX "${CMAKE_CURRENT_BINARY_DIR}/ext/googletest"
    CMAKE_ARGS -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_GTEST=ON 
      DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
    LOG_DOWNLOAD ON
    LOG_CONFIGURE ON
    LOG_BUILD ON
    LOG_INSTALL ON
  )

  ExternalProject_Get_Property(googletest-project install_dir)
  ExternalProject_Get_Property(googletest-project source_dir)

  file(MAKE_DIRECTORY ${install_dir}/include)

  add_library(gtest STATIC IMPORTED)
  add_library(gtest_main STATIC IMPORTED)

  set_property(TARGET gtest PROPERTY IMPORTED_LOCATION 
    ${install_dir}/lib/libgtest.a)
  set_property(TARGET gtest_main PROPERTY IMPORTED_LOCATION 
    ${install_dir}/lib/libgtest_main.a)

  set_property(TARGET gtest APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES 
    ${install_dir}/include)
  set_property(TARGET gtest_main APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES 
    ${install_dir}/include)

  add_dependencies(gtest googletest-project)
  add_dependencies(gtest_main googletest-project)

  set(GTEST_LIBRARIES gtest)
  set(GTEST_MAIN_LIBRARIES gtest_main)

  set(GTEST_INCLUDE_DIRS ${install_dir}/include)
endif()

Таким образом, googletest не будет создан, если он уже установлен в вашей системе (например, в образе Docker со всеми предварительно установленными внешними зависимостями). Как видите, я собираю googletest из каталога подмодулей и не буду клонировать из github.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...