如何在CMakeLists中包含外部库?

时间:2015-07-21 08:31:56

标签: cmake shared-libraries static-libraries

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

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

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

到目前为止,我认为这是我所知道的。

(1)如果你是"幸运"你可以使用find_library并将它链接到你很适合的target_link_libraries。

(2)由于glm是一个仅头文件库,我只需要一个include_directories。

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

这就是我所知道的,我不明白。

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

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

提前感谢所有回复!

祝你好运 埃德温

1 个答案:

答案 0 :(得分:2)

  1. 如果你想快速而肮脏的方式,你可以

    • 创建一个包含所有依赖项的超级仓库(或者编写一个下载或克隆它们的脚本)
    • 编写一个构建所有仅源依赖项的shell脚本
    • 将依赖项的include dirs,库和编译标记硬编码到主项目的CMakeLists.txt中(相对于super-repo root)
    • 在配置主项目之前构建依赖项
  2. 如果依赖项没有CMakeLists.txt或任何其他适合您系统的构建脚本,则需要查找或编写一个。

    1. 如果您想要优雅且可重复使用,您需要学习CMake配置模块的主题。有关快速介绍,请查看此Stackoverflow答案:How to use CMake to find and link to a library using install-export and find_package? 您将需要为依赖项编写config-modules(或找到包含它的fork)。您的主项目将只包含find_package命令列表,并使用target_link_libraries命令列出您的依赖项,配置模块将详细说明所有其他详细信息。
    2. 一般情况下,您不需要将第三方项目直接包含在主项目CMakeListsadd_subdirectoryExternalProject_add)中,因为您不会工作在他们身上所以他们不会改变。不需要将IDE工作区与它们混为一谈。在配置主项目之前,最好使用单独的脚本下载/克隆/构建/安装它们。