我正在创建一个非常小的项目,该项目取决于以下库: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
。
有没有人知道如何解决这个问题而不必将库捆绑到我的代码库中?
答案 0 :(得分:2)
这不是CMake应该如何工作的。
CMake通常会构建一个库的整个分发包,然后将其安装到某个前缀路径。然后,可以通过说" find_package()"来访问系统上的每个其他构建过程。此命令自动查找已安装的分配,以及所有库,包括等。无论图书馆实施者做了什么奇怪的东西,产生的发行版都或多或少相似。
因此,在这种情况下,您可以通过手动添加包含来完成大量不必要的工作。如你所见,它也可能不可靠。
你能做的是:
.gitignore
将每个依赖包构建并安装到项目内或外部的另一个(CMakeLists.txt
d)文件夹中。让我们说一下CMakeLists.txt
CMakeLists.txt
中答案 1 :(得分:1)
Drop's answer的两个小增加:如果库正确设置了它们的安装例程,则可以直接在库的二叉树上使用find_package
,跳过安装步骤。当您对库和依赖项目进行更改时,这非常有用,因为您不必每次都运行INSTALL
目标,以便在下游提供库更改。
另外,请查看CMake的ExternalProject module,它非常便于将外部依赖项作为项目的一部分自动构建。一般的想法是你仍然将库的源代码作为子模块引入,但是不是使用add_subdirectory
将源代码拉入项目,而是使用ExternalProject_Add
自己构建它,然后只需链接从你的项目中反对它。