最前

  • 本文将介绍一种以源码的方式引入第三方库的方法

准备

  • 主项目,需要引用第三方库的某些函数
  • 第三方库,以源码的形式提供给主项目使用
  • 注意: 本文的背景:已经将第三方源码下载好。

一个例子

我这里准备一个简单的项目,调用第三方库 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以源码的方式引入第三方项目的更多相关文章

  1. Linux 中mysql安装(源码安装方式)

    本文是介绍以源码安装的方式编译和安装Mysql 5.6(可以指定安装路径),也可以不采用源码安装方式,直接用安装包的方式. 源码安装方式慎用,容易报错. 1.卸载旧版本 rpm -qa | grep ...

  2. Eclipse Class Decompiler影响class默认打开方式,重新设置Eclipse默认源码打开方式

    安装Eclipse Class Decompiler插件后,Eclipse中的默认源码打开方式被修改为Eclipse Class Decompiler 这不是我喜欢的,因为我希望,源码从网络中获取,当 ...

  3. 控件真的很好用,突然感觉自己以前研究Discuz!NT366源码的方式很2了

    控件真的很好用,突然感觉自己以前研究Discuz!NT366源码的方式很2了,就是按钮上的或其他控件上的图片哪里去了?

  4. 一、安装zabbix监控(源码编方式)

    首先介绍一下zabbix的运行原理和运行条件. Zabbix监控原理 Zabbix 通过C/S 模式采集数据,通过B/S模式在web 端展示和配置.  被监控端:主机通过安装agent 方式采集数据, ...

  5. Android:源码环境下移植第三方的apk内置到ROM(System Image)中

    1. 首先在vendor目录下新建一个the3rdapk的目录,将需要内置的apk丢进去,目录名自己随意定. 2. 在 build/target/product/common.mk最后面,在$(cal ...

  6. redhat6.3下源码编译方式安装最新版git

    在linux下安装git,通过yum方式安装的不是最新版本. 要替换最新版需要以下操作. 1.安装依赖包 # yum install curl-devel expat-devel gettext-de ...

  7. Mybatis Generator的model生成中文注释,支持oracle和mysql(通过修改源码的方式来实现)

    在看本篇之前,最好先看一下上一篇通过实现CommentGenerator接口的方法来实现中文注释的例子,因为很多操作和上一篇基本是一致的,所以本篇可能不那么详细. 首先说一下上篇通过实现Comment ...

  8. centos7下源码编译方式安装httpd

    前言 Apache至少需要apr.apr-util.pcre组件的支持. APR(Apache portable Run-time libraries,Apache可移植运行库)的目的如其名称一样,主 ...

  9. CentOS6.5下搭建LAMP环境(源码编译方式)

    CentOS 6.5安装配置LAMP服务器(Apache+PHP5+MySQL) 学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP ,WAMP,MAMP等.这里我介 ...

随机推荐

  1. UOJ 266 - 【清华集训2016】Alice和Bob又在玩游戏(SG 定理+01-trie)

    题面传送门 神仙题. 首先注意到此题的游戏是一个 ICG,故考虑使用 SG 定理解决这个题,显然我们只需对每个连通块计算一遍其 SG 值异或起来检验是否非零即可.注意到我们每删除一个点到根节点的路径后 ...

  2. Docker-原理解析

    容器! Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件.容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有 ...

  3. No.1 R语言在生物信息中的应用——序列读取及格式化输出

    目的:读入序列文件(fasta格式),返回一个数据框,内容包括--存储ID.注释行(anno).长度(len).序列内容(content) 一.问题思考: 1. 如何识别注释行和序列内容行 2. 如何 ...

  4. Redis篇:单线程I/O模型

    关注公众号,一起交流,微信搜一搜: 潜行前行 redis 单线程 I/O 多路复用模型 纯内存访问,所有数据都在内存中,所有的运算都是内存级别的运算,内存响应时间的时间为纳秒级别.因此 redis 进 ...

  5. 06 windows安装Python+Pycharm+Scrapy环境

    windows安装Python+Pycharm+Scrapy环境 使用微信扫码关注微信公众号,并回复:"Python工具包",免费获取下载链接! 一.卸载python环境 卸载以下 ...

  6. CSS3实现字体描边

    CSS3实现字体描边的两种方法 -webkit-text-stroke: 1px #fff;:不建议,向内描边,字体颜色变细,效果不佳: 用box-shadow模拟描边,向外描边,保留字体粗细,赞! ...

  7. 数据库之JDBC

    1.简单认识一下JDBC 1).JDBC是什么? java database connection       java数据库连接 作用:就是为了java连接mysql数据库嘛 要详细的,就面向百度编 ...

  8. LeetCode子矩形查询

    LeetCode 子矩形查询 题目描述 请你实现一个类SubrectangleQueries,它的构造函数的参数是一个rows * cols的矩形(这里用整数矩阵表示),并支持以下两种操作: upda ...

  9. Vue 前端配置多级目录实践(基于Nginx配置方式)

    前情提要 有阵子没更新博客了,因为快年结了工作比较多,这不,最近公司的对外演示环境出现问题这个活儿也落到了我的头上-- 事情是这样的,原来演示环境有很多服务,每个服务都是对外单独开一个端口,比如 ht ...

  10. Android数据存取

    Android数据存取 一.SharedPreferencesc存取数据 SharedPreferences是使用键值对的方式来存储数据的,也就是在保存一条数据时,需要给这条数据提供一个对应的键,这样 ...