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等.这里我介 ...
 
随机推荐
- Go语言核心36讲(Go语言实战与应用二十)--学习笔记
			
42 | bufio包中的数据类型 (上) 今天,我们来讲另一个与 I/O 操作强相关的代码包bufio.bufio是"buffered I/O"的缩写.顾名思义,这个代码包中的程 ...
 - python13各种器
			
def hello(): print("hello") def test(): print("test") def hello_wrapper(): print ...
 - rabbitmq部署问题
			
启动rabbitmq服务时报错: systemctl status rabbitmq-server 状态显示:Failed to start RabbitMQ broker Failed to sta ...
 - 搭建FastDFS集群
			
先插一张图(学习的时候找的)http://blog.csdn.net/u012453843/article/details/68957209?> 软件下载地址:主要是fastdfs.libfas ...
 - ysoserial-CommonsBeanutils1的shiro无依赖链改造
			
ysoserial-CommonsBeanutils1的shiro无依赖链改造 一.CB1利用链分析 此条利用链需要配合Commons-Beanutils组件来进行利用,在shiro中是自带此组件的. ...
 - SpringBoot集成Kafka的实战用法大全
			
本文是SpringBoot+Kafka的实战讲解,如果对kafka的架构原理还不了解的读者,建议先看一下<大白话kafka架构原理>.<秒懂kafka HA(高可用)>两篇文章 ...
 - sed 修改文件
			
总结 正确的修改进文件命令(替换文件内容):sed -i "s#machangwei#mcw#g" mcw.txt 正确的修改追加进文件命令(追加文件内容):sed -i &quo ...
 - java输入代码
			
import java.util.Scanner; public class Demo59 { public static void main(String[] args) { / ...
 - 从for循环到机器码
			
def p(*x): print(x) p(type(range), dir(range)) r = range(2); i = iter(r) try: p(next(i)); p(next(i)) ...
 - Nginx流量拷贝
			
1. 需求 将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多好处,比如: 可以验证功能是否正常,以及服务的性能: 用真实有效的流量请求去验证,又不用造数据,不影响线上正常访问: 这跟灰度发布还 ...