2015-07-21 120 views
1

我一直在尝试用CMakeLists构建我的项目几天,现在取得了一些成功,但我不确定它究竟是在做什么。如何在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。我如何包含(并构建?)这个库?如果外部库有.h文件和.lib或.dll文件,我该如何包含这个库?在这两种情况下! (lib/dll)

在此先感谢您的任何和所有答复!

问候 埃德温

+0

嘿,问题(4):你有一个尚未建立的外部库。你想用你的应用程序的其余部分来构建它吗? 问题(5a):你知道所有这些文件的目录吗? 问题(5b):您的.lib文件,静态链接库或用于.dll的导入库? –

+0

(4)如果我想动态地或静态地包含它,我咀嚼你的意思是?我不知道什么是最好的,所以并不重要。两者的定义都会很棒! (5a)是! (5b)它是一个静态库。不会想象其他明智的。我的例子是assimp。我下载了二进制文件作为一个zip文件夹,它给了我(除其他外)一个lib32/asssimp.lib文件和一个bin32/assimp.dll文件。所以这不是其他DLL的导入库。 – Edvin

+0

(4)如果外部库很大或者将来可能需要更新版本的库,最好是动态链接库。如果它很小,你不关心未来的更新和/或你不想分发你的程序与许多.dll文件,它是最好的静态链接。 (5a)我之所以这样问,是因为如果CMakeLists可能需要包含一个小函数来查找.dll文件,但如果您已经知道它,则会更容易。 –

回答

1
  1. 如果你想要做的快速和肮脏的方式你可以

    • 创建一个超级回购与所有你的依赖(或者,写一个脚本,下载或克隆他们)
    • 编写一个shell脚本,建立所有仅源的依赖关系
    • hardcode包括目录,libr白羊座和编译依赖的标志进入你的CMakeLists.txt主项目(当然,相对于超回购根)
    • 建立依赖关系你配置你的主要项目

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

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

一般来说,你不需要包括第三方项目直接进入您的主项目的CMakeListsadd_subdirectoryExternalProject_add),因为你不会对它们的工作,使他们不会改变。无需将IDE工作区与它们混杂在一起。在配置主项目之前,最好使用单独的脚本下载/克隆/构建/安装它们。

+0

我不认为他想将外部库文件添加到他的IDE并编辑它们。他希望它能够将他的程序链接到外部库。 –

+0

是的,我不想在我的IDE中的外部库。 哇!你链接的答案很棒!非常感谢Tamas! – Edvin