嵌入库,它包括通过CMake

时间:2016-05-11 00:52:47

标签: c++ cmake

我正在创建一个非常小的项目,该项目取决于以下库:https://github.com/CopernicaMarketingSoftware/AMQP-CPP

我正在做我经常使用的第三方库:我将他们的git repo添加为子模块,并将其与我的代码一起构建:

option(COOL_LIBRARY_OPTION ON)
add_subdirectory(deps/cool-library)
include_directories(deps/cool-library/include)
target_link_libraries(${PROJECT_NAME} coollib)

这对Bullet,GLFW等图书馆来说非常有效。但是,这个AMQP库做了一个非常丑陋的黑客。他们的include目录名为include,但在他们的CMake install()命令中,他们将其重命名为amqpcpp。他们的主标题deps/cool-library/amqpcpp.h使用该“假”目录引用所有其他标题。

当CMake尝试编译依赖于deps/cool-library/amqpcpp.h的源时,会失败,因为它找不到deps/cool-library/amqpcpp/*.h,只有deps/cool-library/include

有没有人知道如何解决这个问题而不必将库捆绑到我的代码库中?

2 个答案:

答案 0 :(得分:2)

这不是CMake应该如何工作的。

CMake通常会构建一个库的整个分发包,然后将其安装到某个前缀路径。然后,可以通过说" find_package()"来访问系统上的每个其他构建过程。此命令自动查找已安装的分配,以及所有库,包括等。无论图书馆实施者做了什么奇怪的东西,产生的发行版都或多或少相似。

因此,在这种情况下,您可以通过手动添加包含来完成大量不必要的工作。如你所见,它也可能不可靠。

你能做的是:

  • 仍然拥有子模块中的所有依赖项源代码分发(通常人们不会这样做)但
  • 使用自己的.gitignore将每个依赖包构建并安装到项目内或外部的另一个(CMakeLists.txt d)文件夹中。让我们说一下CMakeLists.txt
  • 中的自定义构建步骤
  • 使用" find_package()"在构建应用程序时CMakeLists.txt

答案 1 :(得分:1)

Drop's answer的两个小增加:如果库正确设置了它们的安装例程,则可以直接在库的二叉树上使用find_package,跳过安装步骤。当您对库和依赖项目进行更改时,这非常有用,因为您不必每次都运行INSTALL目标,以便在下游提供库更改。

另外,请查看CMake的ExternalProject module,它非常便于将外部依赖项作为项目的一部分自动构建。一般的想法是你仍然将库的源代码作为子模块引入,但是不是使用add_subdirectory将源代码拉入项目,而是使用ExternalProject_Add自己构建它,然后只需链接从你的项目中反对它。