如何在 CMakeLists 中包含外部库?

How to include external libraries in CMakeLists?

几天来我一直在尝试使用 CMakeLists 构建我的项目并取得了一些成功,但我不确定我到底在做什么。

我目前正在使用 5 个外部库。 (Assimp, glew, glfw, glm, DevIL) 我的主要平台是 windows,但平台独立性是一大优势。

所以我的问题是当我想在我的项目中包含一个外部库时如何进行?

这是我目前所知道的。

(1) 如果你是 "lucky",你可以只使用 find_library 和 link 它与 target_link_libraries 你很高兴。

(2) 因为 glm 是一个只有头文件的库,所以我只需要一个 include_directories.

(3) 如果外部库有自己的 CMakeLists,您可以 add_subdirectory 并将 include_directories 设置为头文件所在的位置。

这是我知道我不明白的。

(4) 如果外部库有.h文件和.cpp文件但没有CMakeLists。我如何包含(和构建?)这个库?

(5)(这对我来说是最重要的问题!)如果外部库有 .h 文件和 .lib 或 .dll 文件,我如何包含这个库?在这两种情况下! (lib/dll)

提前感谢所有回复!

此致 埃德文

  1. 如果你想用快捷方式,你可以

    • 创建一个包含所有依赖项的超级仓库(或者编写一个脚本来下载或克隆它们)
    • 编写一个 shell 脚本来构建所有仅源依赖项
    • 将依赖项的包含目录、库和编译标志硬编码到主项目的 CMakeLists.txt 中(好吧,相对于 super-repo root)
    • 在配置主项目之前构建依赖项

如果依赖项没有 CMakeLists.txt 或任何其他适合您系统的构建脚本,您需要查找或编写一个。

  1. 如果你想做的优雅且可重用,你需要研究 CMake 配置模块的主题。如需快速介绍,请查看此 Whosebug 答案:How to use CMake to find and link to a library using install-export and find_package? 您将需要为依赖项编写配置模块(或找到具有它的分支)。您的主项目将仅包含一个 find_package 命令列表,您使用 target_link_libraries 命令列出您的依赖项,所有其他细节将由配置模块处理。

通常您不需要将第三方项目直接包含到主项目的 CMakeListsadd_subdirectoryExternalProject_add)中,因为您不会处理它们,因此它们不会改变。没有必要用它们弄乱您的 IDE 工作区。最好在配置主项目之前使用单独的脚本 download/clone/build/install 它们。