cmake以源码的方式引入第三方项目
最前
- 本文将介绍一种以源码的方式引入第三方库的方法
准备
- 主项目,需要引用第三方库的某些函数
- 第三方库,以源码的形式提供给主项目使用
- 注意: 本文的背景:已经将第三方源码下载好。
一个例子
我这里准备一个简单的项目,调用第三方库 fmt;其中fmt是以源码的形式引入项目
- cmake version: 3.17
- platform: os X 10.15
目录结构
.
├── build # 存放cmake配置结果
├── cmake # 自己写的 .cmake 文件存放目录
├── ext # 第三方源码存放目录
│ ├── fmt # fmt库
│ └── spdlog-1.x # spdlog库
└── src # 主项目的 .cc文件目录
fmt.cmake 文件内容
spdlog与fmt库都是第三方库,本文只演示fmt库。 fmt.cmake存放在cmake目录下
include(FetchContent)
FetchContent_Declare(
fmt
SOURCE_DIR ${PROJECT_SOURCE_DIR}/ext/fmt
)
FetchContent_GetProperties(fmt)
if (NOT fmt_POPULATED)
FetchContent_Populate(fmt)
# win:下面这行是将fmt添加到解决方案中
add_subdirectory(${fmt_SOURCE_DIR} ${fmt_BINARY_DIR})
endif()
其中, FetchContent_Declare用法如下:
FetchContent_Declare(
fmt # 库的名字
SOURCE_DIR ${PROJECT_SOURCE_DIR}/ext/fmt # 库在本地的哪个目录
)
回报根目录下的 CMakeLists.txt
使用 include 包含库 fmt 。
# 设置搜索路径
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}")
# 包含目录
include(fmt)
完整源码
cmake_minimum_required(VERSION 3.17)
# ---------------------------------------------------------------------------------------------------
# 1. set name
project(demo_fp)
aux_source_directory( "${CMAKE_CURRENT_SOURCE_DIR}/src" src_cc)
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}")
include(fmt)
if(fmt_FOUND)
message(STATUS "1111 its not find fmt library- ------------")
else()
message(STATUS "2222 its find fmt library- ------------")
add_executable(${PROJECT_NAME})
target_sources(${PROJECT_NAME} PUBLIC ${src_cc})
target_link_libraries(${PROJECT_NAME} PUBLIC fmt::fmt)
endif(fmt_FOUND)
cmake配置结果
转到 build 目录,执行cmake .. , 结果:

再执行命令: make 即可得到结果

well done.
src/main.cc内容
根目录 src下的main.cc文件内容
#ifdef _WIN32
#pragma once
#endif
#include <fmt/format.h>
#include <iostream>
int main(int argc, char* argv[], char* env[])
{
std::string str = fmt::format("{0} + {1} = {2}", 1, 2, 3);
std::cout << "str=" << str.c_str() << "\n\n";
return 0;
}
可执行程序运行结果

cmake以源码的方式引入第三方项目的更多相关文章
- Linux 中mysql安装(源码安装方式)
本文是介绍以源码安装的方式编译和安装Mysql 5.6(可以指定安装路径),也可以不采用源码安装方式,直接用安装包的方式. 源码安装方式慎用,容易报错. 1.卸载旧版本 rpm -qa | grep ...
- Eclipse Class Decompiler影响class默认打开方式,重新设置Eclipse默认源码打开方式
安装Eclipse Class Decompiler插件后,Eclipse中的默认源码打开方式被修改为Eclipse Class Decompiler 这不是我喜欢的,因为我希望,源码从网络中获取,当 ...
- 控件真的很好用,突然感觉自己以前研究Discuz!NT366源码的方式很2了
控件真的很好用,突然感觉自己以前研究Discuz!NT366源码的方式很2了,就是按钮上的或其他控件上的图片哪里去了?
- 一、安装zabbix监控(源码编方式)
首先介绍一下zabbix的运行原理和运行条件. Zabbix监控原理 Zabbix 通过C/S 模式采集数据,通过B/S模式在web 端展示和配置. 被监控端:主机通过安装agent 方式采集数据, ...
- Android:源码环境下移植第三方的apk内置到ROM(System Image)中
1. 首先在vendor目录下新建一个the3rdapk的目录,将需要内置的apk丢进去,目录名自己随意定. 2. 在 build/target/product/common.mk最后面,在$(cal ...
- redhat6.3下源码编译方式安装最新版git
在linux下安装git,通过yum方式安装的不是最新版本. 要替换最新版需要以下操作. 1.安装依赖包 # yum install curl-devel expat-devel gettext-de ...
- Mybatis Generator的model生成中文注释,支持oracle和mysql(通过修改源码的方式来实现)
在看本篇之前,最好先看一下上一篇通过实现CommentGenerator接口的方法来实现中文注释的例子,因为很多操作和上一篇基本是一致的,所以本篇可能不那么详细. 首先说一下上篇通过实现Comment ...
- centos7下源码编译方式安装httpd
前言 Apache至少需要apr.apr-util.pcre组件的支持. APR(Apache portable Run-time libraries,Apache可移植运行库)的目的如其名称一样,主 ...
- CentOS6.5下搭建LAMP环境(源码编译方式)
CentOS 6.5安装配置LAMP服务器(Apache+PHP5+MySQL) 学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP ,WAMP,MAMP等.这里我介 ...
随机推荐
- 回文字符串 Manacher
1. Manacher 忘光了,忘光了. 首先将字符串所有字符之间(包括头尾)插入相同分隔符,再在最前方插入另一个分隔符防止越界. 设以 \(s_i\) 为对称中心的回文串中,最长的回文半径为 \(p ...
- CUDA计算矩阵相乘
1.最简单的 kernel 函数 __global__ void MatrixMulKernel( float* Md, float* Nd, float* Pd, int Width) { int ...
- bwa比对软件的使用以及其结果文件(sam)格式说明
一.bwa比对软件的使用 1.对参考基因组构建索引 bwa index -a bwtsw hg19.fa # -a 参数:is[默认] or bwtsw,即bwa构建索引的两种算法,两种算法都是 ...
- c语言转义字符如下
#define MQTT_EVENT_REPORT_BOX_STATUS_FORMAT "{"\ ...
- 类成员函数调用delete this会发生什么呢?
有如下代码 class myClass { public: myClass(){}; ~myClass(){}; void foo() { delete this; } }; int main() { ...
- Linux修改默认挂载NFS协议版本
系统版本:CentOS Linux release 7.4.1708 (Core) $ vi /etc/nfsmount.conf # # /etc/nfsmount.conf - see nfsmo ...
- 学习java的第十六天
一.今日收获 1.完成了手册第二章没有验证完成的例题 2.预习了第三章的算法以及for语句与if语句的用法 二.今日难题 1.验证上出现问题,没有那么仔细. 2.第二章还有没有完全理解的问题 三.明日 ...
- Assertion failure in -[UISectionRowData refreshWithSection:tableView:tableViewRowData:], /Source
1. *** Assertion failure in -[UISectionRowData refreshWithSection:tableView:tableViewRowData:], /Sou ...
- Bitmaps与优化
1.有效的处理较大的位图 图像有各种不同的形状和大小.在许多情况下,它们往往比一个典型应用程序的用户界面(UI)所需要的资源更大. 读取一个位图的尺寸和类型: 为了从多种资源来创建一个位图,Bitma ...
- vue-cli4脚手架搭建一
涉及内容 html css javascript node.js npm webpack 2.9.6是常用版本 vue-cli4是基于webpack的 webpack是基于node ...