嵌入库及其's包括通过CMake
Embedding library and it's includes via CMake
我正在创建一个非常小的项目,它依赖于以下库:https://github.com/CopernicaMarketingSoftware/AMQP-CPP
我一直在做我对第三方库所做的事情:我将它们的git-reo添加为子模块,并将它们与我的代码一起构建:
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
。
有人知道我如何在不必将库绑定到我的代码库中的情况下解决这个问题吗?
这不是CMake的工作方式。
CMake通常构建一个库的整个分布式包一次,然后将其安装到某个前缀路径。然后,系统上的每个其他构建进程都可以通过说"find_package()"来访问它。此命令自动查找已安装的distribution以及所有的libs、includes等。无论库实现者做了什么奇怪的事情,最终的发行版或多或少都是相似的。
因此,在这种情况下,您通过手动添加include来完成许多不必要的工作。正如你所看到的,它也可能是不可靠的。
你能做的是:
- 仍然在子模块中拥有所有依赖性源发行版(不过通常人们不会这么做)
- 使用它们自己的
CMakeLists.txt
将每个依赖包构建并安装到项目内或项目外的另一个(.gitignore
d)文件夹中。假设在CMakeLists.txt
中使用自定义构建步骤 - 构建应用程序时,请在
CMakeLists.txt
中使用"find_package()"
Drop的答案还有两个小补充:如果库正确设置了安装例程,您可以直接在库的二进制树上使用find_package
,跳过安装步骤。当您对库和依赖项目都进行更改时,这一点非常有用,因为您不必每次都运行INSTALL
目标来使库更改在下游可用。
此外,请查看CMake的ExternalProject模块,它非常方便将外部依赖项作为项目的一部分自动构建。一般的想法是,您仍然将库的源代码作为子模块引入,但不是使用add_subdirectory
将源代码引入您的项目,而是使用ExternalProject_Add
自行构建它,然后从您的项目中链接它。
- 为什么 cmake 许可证<>样式不包括?
- C++ ZBar cmake 错误"找不到文件"时包括
- 包括带有 cmake 的静态库
- 构建MacOS可执行文件,以便使用cmake(包括OpenCV)进行分发
- cmake:包括vs vs add_subDirectory:相对标头文件路径
- 安装了要来源的特征cmake目标点包括但不安装
- CMake:包括外部库标头
- 生成生成 makefile 时不包括 cmake C++11 标志
- cmake-包括静态库中的依赖项
- CMake 包括目录别名
- 包括通过CMAKE工具链正确版本的STL标题
- 如何删除特定系统包括CMAKE中的目录
- Cmake仅包括仅来自标头目标的标题目标
- cmake-包括外部项目的目录
- 如何在不安装的情况下将opencv源文件作为cmake依赖项包括在内
- 在使用CMake构建时包括Android标头
- CMake 包括第三方项目
- C++项目组织(包括gtest,cmake和doxygen)
- 嵌入库及其's包括通过CMake
- 包括带有 CMake 的共享库 (.so)