项目场景:
最近要在项目中添加一个第三方的头文件库(我用的是spdlog),官方的文档建议放在项目的include文件夹下,但是我的项目没有incldue文件夹,只有3rdparty这个文件夹,如果放在3rdparty下,cmake编译有问题
解决方案
先上解决方案:
关键代码是这两行:
${CMAKE_SOURCE_DIR}/3rdparty
${CMAKE_SOURCE_DIR}/3rdparty/spdlog
分析:
如上图所示,我添加了spdlog,首先添加
${CMAKE_SOURCE_DIR}/3rdparty/spdlog #1
补充一下我是如何在文件中使用spdlog的:
如果只添加了#1的话,会报如下错误(spdlog.h找不到自身需要的库文件):
因为在spdlog中头文件引用方式为:
此时,修改所有的spdlog库文件中的include语句,去除额外的spdlog,可以编译成功
#include <spdlog/common.h> //改为 #include <common.h>
或者cmake tartget_include_directory修改为:
${CMAKE_SOURCE_DIR}/3rdparty
然后修改include的方式,但是这可能会导致其他的问题(我已经搞定了,懒得复现了,如果可以用也可以采用这种方式)
其实只要再添加一句(#2)就能解决问题:
${CMAKE_SOURCE_DIR}/3rdparty #2
${CMAKE_SOURCE_DIR}/3rdparty/spdlog #1
当然如果你不介意修改项目结果,添加一个include文件夹的话,只要把头文件库丢进include,甚至可以不配置target_include_directories都可以成功编译
- 最后再补充一个替换的写法,省事但是不太推荐:
file(GLOB 3RDPARTY_INCLUDE "${CMAKE_SOURCE_DIR}/3rdparty/*")
target_include_directories(你的项目名 PUBLIC ${3RDPARTY_INCLUDE})
省略了你一项一项添加,但是维护起来就不太方便