【问题标题】:How to include third party tools with cmake?如何在 cmake 中包含第三方工具?
【发布时间】:2021-04-03 14:49:36
【问题描述】:

我一直在从事 CPP 项目,但在 Visual Studio IDE 上使用配置。现在,我想使用构建系统生成器 CMake。入门有点困难。

我正在尝试为我的测试添加 cppunit 第三方工具。为此,我在文件夹 third_party 中添加了包含和 lib 文件。但不确定如何将其包含在 CMakeLists.txt 中。

请找到 CMakeList.txt

# CMake version setting
cmake_minimum_required(VERSION 3.8)
if(${CMAKE_VERSION} VERSION_LESS 3.19)
    cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
else()
    cmake_policy(VERSION 3.19)
endif()

# Set project name and version
project(myproject
    VERSION 1.0
    DESCRIPTION "Setup cmake build system"
    LANGUAGES CXX
)

# Third party dependencies
set(THIRD_PARTY_DIR "${PROJECT_SOURCE_DIR}/third_party")

# CPP unit
set(CPP_UNIT_LIB_NAME "cppunit")
set(CPP_UNIT_VERSION "1.13.2")
set(CPP_UNIT_DIR "${THIRD_PARTY_DIR}/${CPP_UNIT_LIB_NAME}/${CPP_UNIT_VERSION}")

# NOT sure what to do here
# add_subdirectory(${CPP_UNIT_DIR})
# target_include_directories(${PROJECT_NAME} PRIVATE "${CPP_UNIT_DIR}/include/cppunit")
# target_link_libraries(${PROJECT_NAME}  ${CPP_UNIT_LIB_NAME} ${CPP_UNIT_LIBRARIES})
# target_compile_definitions(${PROJECT_NAME}  PRIVATE "CPP_UNIT_INCLUDE_NONE")

add_subdirectory(src)

请找到文件夹结构的快照

【问题讨论】:

  • 我还读到我们不应该在项目中使用文件 (GLOB)、include_directories、link_directories 等。

标签: c++ windows cmake cppunit


【解决方案1】:

add_subdirectory(${CPP_UNIT_DIR}) 将在为 CMakeLists.txt 指定的目录中查找,并且由于 CppUnit 有一个 CMakeLists.txt 文件 (https://github.com/Ultimaker/CppUnit/blob/master/CMakeLists.txt),它将构建指定为 add_library(cppunit STATIC ${Sources}) 的库,即cppunit

然后,当您指定要构建的目标时,您可以使用target_link_libraries(your_target cppunit) 在 cppunit 中链接。但是您需要创建目标,例如使用 add_executable(one two.cpp three.h) 创建目标 one

https://cliutils.gitlab.io/modern-cmake/ 是一个很好的 CMake 介绍资源。并且有不同的方法可以引入外部项目,例如通过 git 子模块。

如果您在 src 子目录中有一个 CMakeLists.txt 文件,您可以在其中创建一个目标,您可以在 cppunit 中链接。

至于关于include_directories 的评论,通常认为使用target_include_directories 是一种很好的做法,请参阅What is the difference between include_directories and target_include_directories in CMake? 和上面的链接资源了解更多信息。

【讨论】:

  • 谢谢,@ORR。这真的很有帮助。这里还有一个问题。如果我有一些只有头文件并且没有 CMakeLists.txt 的 3rd 方工具。而且,如果我不想将 cppunit 的源文件保留在我的项目目录中。与我的项目目标链接的方式是什么?如果您可以分享此特定主题的正确参考。这也很有帮助。
  • @Avi 欢迎您。您可以为仅头文件创建INTERFACE 库目标,请参见mariobadr.com/creating-a-header-only-library-with-cmake.html。如果您使用 git,那么将您的外部项目添加为 git 子模块将意味着 git 只需跟踪您使用的外部项目,因此您不会保留源代码,但在构建项目时会拉入源代码,例如git submodule add iscinumpy.gitlab.io/post/gtest-submodule cliutils.gitlab.io/modern-cmake/chapters/projects/… 然后像你之前所做的那样调用add_subdirectory(submodule_name)
  • @Avi 将在构建时引入子模块,并且您的 src 文件夹不应包含任何混乱,因为您的外部项目将在 gitmodules 文件中命名。或者您可以尝试使用ExternalProject_add,例如stackoverflow.com/questions/15175318/… 如果你发现你的构建中充满了不同的目标,例如在 Visual Studio 中,您可以设置 set_property( GLOBAL PROPERTY USE_FOLDERS ON) 以使用文件夹结构并将特定目标放在特定文件夹中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2020-03-04
  • 2013-10-11
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多