最前

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

准备

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

一个例子

我这里准备一个简单的项目,调用第三方库 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. 洛谷 P6860 - 象棋与马(找性质+杜教筛)

    题面传送门 首先我们来探究一下什么样的 \((a,b)\) 满足 \(p(a,b)=1\).不难发现只要点 \((1,0)\) 能够到达,那么网格上所有点都能到达,因为由于 \((1,0)\) 能够到 ...

  2. 用pipenv管理python虚拟环境

    python的虚拟环境可以为项目创建一个独立的环境,能够解决使用不同版本依赖给项目带来冲突的麻烦.创建虚拟环境的方式有很多种,pipenv会自动帮你管理虚拟环境和依赖文件,并且提供了一系列命令和选项来 ...

  3. python 调用系统软件

    直接使用os模块的popen打开 import sys import os a=os.popen('/Soft/samtools-1.2/samtools flags '+sys.argv[1] ,' ...

  4. 内存管理malloc 2

    malloc可以在函数指针内使用.#include <stdio.h> #include <stdlib.h> char * get_string() { //char s[] ...

  5. 在VS2008环境下编写C语言DLL,并在C++和C#项目下调用 (转载)

    1.编写DLL a)文件--打开--新建项目--Win32,右侧Win32项目,填写好项目名称,点击"下一步", 应用程序类型选择:"DLL(D)",附加选项: ...

  6. HDFS05 NameNode和SecondaryNameNode

    NameNode和SecondaryNameNode(了解) 目录 NameNode和SecondaryNameNode(了解) NN 和 2NN 工作机制 NameNode工作机制 Secondar ...

  7. IT四大名著

    标题耸人听闻,sorry. CPU.操作系统.编译器和数据库我都不会.我英语也不行,但我认识所有的字母.:-) 万一有人感兴趣呢?https://sqlite.org/doclist.htmlThe ...

  8. volatile原理和应用场景

    volatile是java语言中的一个关键字,常用于并发编程,有两个重要的特点:具有可见性,java虚拟机实现会为其满足Happens before原则;不具备原子性.用法是修饰变量,如:volati ...

  9. 关于C语言中不同类型数据进行计算 有符号和无符号数进行计算

    float是8个有效位, 做个试验: 输出如下: 上面说明了什么: 1, 18/2.2 是除不尽的, 因为是define,所以没有给ratio变量赋值类型,但是从sizeof输出的结果是8,所以系统默 ...

  10. Docker 安装 Oracle12c

    为选定需要pull到系统中的数据库镜像 # docker pull sath89/oracle-12c --------sath89/oracle-12c为选定需要pull到系统中的数据库镜像 doc ...