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等.这里我介 ...
随机推荐
- Oracle-left join两表关联只取B表匹配到的第一条记录【over partition by(分组后对组内数据排序)】
背景: A表.B表两表关联,关联出来的结果里B表有不止一条,需求是只要B表结果中的某一条(按某字段排序) 经过百度,发现 row_number() over(partition by a order ...
- PHP识别二维码(php-zbarcode)
PHP识别二维码(php-zbarcode) 标签: php二维码扩展 2015-11-06 17:12 609人阅读 评论(0) 收藏 举报 分类: PHP(1) Linux 版权声明:本文为博 ...
- 业务逻辑审批流、审批流、业务、逻辑、面向对象、工作方式【c#】
------需求分析:--------1.先按照实际线下流程说这是什么事情,实际要干什么.2.再转换为面向对象-页面的操作流程,演示demo3.再与相关人员沟通是否可行需要什么地方修正.4.最终:线上 ...
- 第一个基础框架 — mybatis框架 — 更新完毕
1.Mybatis是什么? 百度百科一手 提取一下重点: MyBatis 本是apache的一个开源项目iBatis.即:mybatis的原名为:ibatis 2010年迁移到google code, ...
- abort, about
abort 变变变: abortion:堕胎 abortionist:(非法)做堕胎手术的,不是所有的ist都是scientist, "All that glitters is not go ...
- day11 四层负载均衡和http协议
day11 四层负载均衡和http协议 四层负载均衡和七层负载均衡的区别 四层和七层负载均衡的区别 四层负载均衡数据包在底层就进行了分发,而七层负载均衡数据包则是在最顶层进行分发.由此可以看出,七层负 ...
- 零基础学习java------day27-28---------电影评分数据案例,. RPC案例
一. 电影评分数据案例 movie:电影id rate:用户评分 timeStamp:评分时间 uid:用户id 简化数据: 需求: (1)每个用户评分最高的3部电影 (2)每个用户评分的平均值 ( ...
- Vue相关,vue父子组件生命周期执行顺序。
一.实例代码 父组件: <template> <div id="parent"> <child></child> </div& ...
- Oracle中创建DB LINK
当用户要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据.下面讲介绍如何在本地数 ...
- 常见排序——Java实现
1 package struct; 2 3 /** 4 * 5 * @作者:dyy 6 * @公司:陕西科技大学 7 * @修改日期: 8 * @邮箱:1101632375@qq.com 9 * @描 ...