C++ 如何将第三方工具包括在cmake中?

C++ 如何将第三方工具包括在cmake中?,c++,windows,cmake,cppunit,C++,Windows,Cmake,Cppunit,我一直在从事一个CPP项目,但使用的是VisualStudioIDE上的配置。现在,我想使用构建系统生成器CMake。开始做这件事有点困难 我正在尝试为我的测试添加第三方工具。为此,我在第三方的文件夹中添加了include和lib文件。但不确定如何将其包含在CMakeLists.txt中 请查找CMakeList.txt # CMake version setting cmake_minimum_required(VERSION 3.8) if(${CMAKE_VERSION} VERSION_

我一直在从事一个CPP项目,但使用的是VisualStudioIDE上的配置。现在,我想使用构建系统生成器CMake。开始做这件事有点困难

我正在尝试为我的测试添加第三方工具。为此,我在第三方的文件夹中添加了include和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)
请查找文件夹结构的快照

add_子目录(${CPP_UNIT_DIR})
将在指定的目录中查找CMakeLists.txt,由于CppUnit有一个CMakeLists.txt文件(),它将构建指定的库
add_库(CppUnit STATIC${Sources})
,即
CppUnit

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

是一个很好的介绍CMake的资源。引入外部项目有不同的方式,比如通过git子模块

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


关于
include_目录
的评论,通常认为最好使用
target_include_目录
,更多信息请参见和上面的链接资源。

我还了解到,我们不应该在项目中使用文件(GLOB)、include_目录、link_目录等。谢谢,@ORR。这真的很有帮助。这里还有一个问题。如果我有一些第三方工具,它们只有头文件,没有它们的CMakeLists.txt。而且,如果我不想在我的项目目录中保留cppunit的源文件。与我的项目目标相联系的方式是什么?如果你能分享这个特定主题的正确参考资料。那也很有帮助。@Avi不客气。您可以为仅头文件创建
接口
库目标,请参见。如果您使用git,那么将外部项目添加为git子模块将意味着git只需跟踪您使用的外部项目,因此您不会保留源代码,但在构建项目时会将源代码拉入,例如,
git submodule add
,然后像之前一样调用
add\u子目录(子模块名称)
@Avi将在构建时引入子模块,您的src文件夹不应包含任何杂乱内容,因为您的外部项目将在gitmodules文件中命名。或者,您可以尝试使用
ExternalProject\u add
,例如,如果您发现您的生成包含不同的目标,例如在Visual studio中,您可以设置
set\u属性(全局属性使用文件夹打开)
以使用文件夹结构并将特定目标放在特定文件夹中。