最前

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

准备

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

一个例子

我这里准备一个简单的项目,调用第三方库 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. 【GS文献】从家畜到植物,通过基因组选择提高遗传增益

    目录 说明 1.前言 2.植物GS瓶颈 3.提高GS预测的准确性 4.GS与现代育种技术结合 5.GS开源育种网络 说明 Enhancing Genetic Gain through Genomic ...

  2. ubuntu常见错误--Could not get lock /var/lib/dpkg/lock

    ubuntu常见错误--Could not get lock /var/lib/dpkg/lock   通过终端安装程序sudo apt-get install xxx时出错:   E: Could ...

  3. 4.Reverse Words in a String-Leetcode

    class Solution { public: void reverseWords(string &s) { vector<string> data; string word; ...

  4. echarts中饼状图数据太多进行翻页

    echarts饼状图数据太多 echarts 饼状图内容太多怎么处理 有些时候,我们饼状图中echarts的数据可能会很多. 这个时候展示肯定会密密麻麻的.导致显示很凌乱 我们需要'翻页'类似表格展示 ...

  5. day03 Django目录结构与reques对象方法

    day03 Django目录结构与reques对象方法 今日内容概要 django主要目录结构 创建app注意事项(重点) djago小白必会三板斧 静态文件配置(登录功能) requeste对象方法 ...

  6. Spark(九)【RDD的分区和自定义Partitioner】

    目录 spark的分区 一. Hash分区 二. Ranger分区 三. 自定义Partitioner 案例 spark的分区 ​ Spark目前支持Hash分区和Range分区,用户也可以自定义分区 ...

  7. Java、Scala类型检查和类型转换

    目录 Java 1.类型检查 2.类型转换 Scala 1.类型检查 2.类型转换 Java 1.类型检查 使用:变量 instanceof 类型 示例 String name = "zha ...

  8. java内存管理的小技巧

    1,尽量使用直接量.     采用String str="hello"; 而不是 String str = new String("hello"): 2,使用S ...

  9. SpringIOC原理浅析

    1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机械 ...

  10. MyBatis(4):使用limit实现分页

    用limit实现分页,首先要创建一个Maven项目,搭建好mybatis的实验环境,并且连接好数据库 代码 1,编写dao接口 UserMapper //查询全部用户实现分页 List<User ...