在项目中包含C ++库的最佳实践

里卡德·莫林斯

我面临一些与如何处理C ++项目有关的问题。我有一组所有使用git跟踪的存储库(托管在gitlab上)。

  • repo_A:我当前的项目
  • repo_B:我创建并需要在其中使用的库 repo_A

这是包括最佳实践repo_Brepo_A

  1. repo_B在系统级别安装然后用repo_Brepo_A使用CMakelists
  2. repo_B作为子模块添加repo_A
  3. 通过使用类似于googletest存储库中所述的方法将其添加到CMakeLists中

    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之后,我们面临一些问题。

盖里·尼里

最好的选择是混合版本。我通常将外部库作为git子模块(在PROJECT_ROOT /子模块中)进行跟踪,并为所有这些库创建通用的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。如您所见,我从子模块目录构建googletest,而不会从github克隆。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python库项目结构最佳实践:导入和测试

为项目构建大型库时的最佳实践

在奥尔良项目中处理关系数据库中的遗留数据的最佳实践是什么?

如何在我的C ++项目中包含activeX库?

CMake:在项目中包含库

DI Unity在多个项目中-最佳实践

MVP项目中包结构的最佳实践

将大型资源文件夹包含到 java 项目中的最佳实践

在项目中包含Bootstrap的最佳方法?

编码C ++的最佳实践

C ++继承的最佳实践

低调最佳实践(C ++)

在Microsoft Visual Studio 2015的C ++项目中包含Armadillo C ++库

从包含多个程序集的库中公开类时的最佳实践是什么?

将多个项目放入git存储库的最佳实践是什么?

同时开发Composer的库和主要项目的最佳实践是什么?

库项目的build.gradle中的buildscript标记的最佳实践

为每个项目创建一个新的存储库是最佳实践吗?

扩大ListView / RecyclerView项目时查询数据库的最佳实践

处理大型Java项目中内存泄漏的最佳实践?

最佳实践:多项目中的版本控制和发行

在Java项目中引用外部模块的最佳实践

Gradle API与在多模块项目中实现的最佳实践

在作曲家项目中使用VCS的最佳实践

一个项目中的最佳实践webapi /网站

大型Web项目中Browserify的最佳实践-Gulp

如何将http C库正确包含到Android项目中?

如何正确地将 C++ 静态库包含到 iOS 项目中

在我自己的项目中包含Hackage已发布库的分支和未发布版本的最佳方法