我正在创建一个非常小的项目,该项目取决于以下库: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库确实有一个难看的hack。他们的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()”,可以对系统上的所有其他构建过程进行访问。该命令自动查找已安装的发行版本以及所有库,包含文件等。不管奇怪的东西是库实现者做什么,所产生的发行版或多或少都是相似的。
因此,在这种情况下,您可以通过手动添加include来做很多不必要的工作。如您所见,它也可能不可靠。
您可以做的是:
仍将所有依赖项源分发放在子模块中(尽管人们通常不会这么做)
使用自己的.gitignore
将每个依赖关系程序包构建并安装到项目中或外部的另一个(CMakeLists.txt
d)文件夹中。假设您在CMakeLists.txt
中使用自定义生成步骤
在构建应用程序时,在CMakeLists.txt
中使用“ find_package()”
关于c++ - 嵌入库,并且通过CMake包含,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37151304/