用CMake下的find_package()函数链接库

news2024/12/23 10:43:49

文章目录

    • find_package()原理
    • 案例1:为项目添加库

find_package()原理

关于find_package()函数的相关内容可参考:

https://www.cnblogs.com/lidabo/p/16635249.html

Cmake 会在以下的路径中寻找Config.cmake或Find.cmake文件。找到后即可执行该文件并生成相关链接信息

<prefix>/(lib/<arch>|lib|share)/cmake/<name>*/          (U)
<prefix>/(lib/<arch>|lib|share)/<name>*/                (U)
<prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/  (U)

例如在我们的linux系统上用下面命令就能查看xxx.cmake文件

ls /usr/share/cmake-3.16/Modules

find_package的工作模式:

  • Module模式
    find_package命令基础工作模式(Basic Signature),也是默认工作模式。
  • Config模式
    find_package命令高级工作模式(Full Signature)。 只有在find_package()中指定CONFIG、NO_MODULE等关键字,或者Module模式查找失败后才会进入到Config模式。

案例1:为项目添加库

需求:现有一个libadd库,我们希望别的项目可以通过find_package对它进行引用我们应该怎么办呢?

首先我们创建一个文件夹 libadd
在该文件夹下有两个文件:
libadd.cpp

#include <iostream>
#include "libadd.h"

using namespace std;

void libadd(int a,int b){
    nt res = a+b;
    cout<<a<<"+"<<b<<"="<<res<<endl;
}

libadd.h

#ifndef _HEAD_H
#define _HEAD_H
// 加法
void libadd(int a, int b);
#endif

接下来需要得到一个库文件,输入下面的命令:

# 编译生成共享库,也可以在makefile中编译
g++ -c -fPIC libadd.cpp -o libadd.so

同时在该文件夹下新建 Makefile 文件,输入:

CC = g++
CFLAGS  := -Wall -O3 -std=c++11 

LIB = libadd.so # 目标文件名
INCLUDE = ./ # 头文件目录
HEADER = libadd.h # 头文件

all : install

# 2. 生成.o文件 

# 3. 生成动态库文件


# 4. 删除中间过程生成的文件 

# 5.安装文件
install:
    cp $(LIB) /home/nio/workspace/Gitspace/cmaketest/install
    cp $(HEADER) /home/nio/workspace/Gitspace/cmaketest/install

现在该文件夹(/home/nio/workspace/Gitspace/cmaketest/libadd)下有下面四个文件:

接下来把头文件和库安装到一个自定义文件夹中,这边装在install里面

mkdir ../install

make install

不出意外的话,install里面会有头文件和库

第一步工作完成了,也就是说libadd的库已经做好了,接下来在任意地方新建一个test文件夹,创建一个main.cpp用于调用libadd
main.cpp

#include<iostream>
#include "libadd.h"

int main(){
    libadd(1,2);
}

再新建一个CMakeLists.txt 文件,我们要在生存可执行文件的同时链接到Add的库

CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
# 工程名
project(Test)


set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}"i)
add_executable(main main.cpp)
find_package(Add)
if(ADD_FOUND)
    target_include_directories(main PRIVATE ${ADD_INCLUDE_DIR})
    target_link_libraries(main ${ADD_LIBRARY})
else(ADD_FOUND)
    message(FATAL_ERROR "ADD library not found")
endif(ADD_FOUND)

再新建一个FindAdd.cmake文件,用于找到Add的库,需要把头文件和库的地址都给出

FindAdd.cmake

find_path(ADD_INCLUDE_DIR libadd.h /home/nio/workspace/Gitspace/cmaketest/install)
find_library(ADD_LIBRARY libadd.so /home/nio/workspace/Gitspace/cmaketest/install)

if (ADD_INCLUDE_DIR AND ADD_LIBRARY)
    set(ADD_FOUND TRUE)
endif (ADD_INCLUDE_DIR AND ADD_LIBRAR)

最后在当前文件夹中执行:

mkdir build
cd build

cmake ..
make
./main

最后输出结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/683219.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pycharm 2023 IDE 个人一些常用配置记录|输入法|中文|光标|

1. 中文 文件->设置->插件,找到这个&#xff1a; 2. 光标前进和后退 移除前面的配置&#xff0c;修改一下&#xff0c;改称Ctrl左键头\右箭头 然后点击确定 3.中文输入法 3.1 解决输入法有无问题 在pycharm安装目录bin下的pycharm.sh中&#xff0c;添加如下几行&am…

白酒回收APP开发需具备哪些功能?

开发白酒回收APP软件需要具备哪些功能呢&#xff1f; 1、酒品展示。白酒回收APP首页展示各种人们回收的白酒产品&#xff0c;还可以对白酒进行品牌分类&#xff0c;这样用户在回收售卖的时候可以快速找到自己需要的品牌&#xff0c;点击进入查看回收指南&#xff0c;一步…

中国葡萄酒 当惊世界殊 宁夏贺兰山东麓葡萄酒亮相首都地铁

近日&#xff0c;宁夏贺兰山东麓葡萄酒以“中国葡萄酒 当惊世界殊、中国酒庄酒 天赋贺兰山”为宣传主题的宁夏贺兰山东麓葡萄酒宣传专列&#xff08;列车车号&#xff1a;01055&#xff09;亮相北京地铁1号线。该专列将从4月7日至7月6日持续开行3个月&#xff0c;平均每天往返穿…

Snipaste下载

官网&#xff1a; Snipaste 下载 解压 在桌面右下角状态栏中可以找到软件图标&#xff0c; 如图所示&#xff0c;已经运行成功 鼠标右键点击该图标&#xff0c;选择首选项可以设置相关功能选项。 设置了开机自启 最后将该文件夹放到合适的路径下&#xff0c;重新双击运行Snipa…

计算物理专题:薛定谔方程的有限元解法

计算物理专题&#xff1a;薛定谔方程的有限元解法 简单边值问题的有限元解法 其中&#xff1a;都是上已知的连续函数&#xff0c;且也连续&#xff0c; 等价性定理 如果y(x)是边值问题(1)的解&#xff0c;则y(x)是\mu 中使得泛函I(z)取极小值的函数&#xff1b;反正&#xff0c…

【面试题系列】关于K8s—Job的2个问题

序言 人生是一场消耗&#xff0c;要把美好的时光放在喜欢的人与事上。 写在前面 前面学习了job&#xff0c;现在思考一下两个问题 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标…

only up 游戏分析

文章目录 介绍游戏玩法游戏面向的群体游戏所须配置游戏美术风格游戏优点游戏缺点和改进方案游戏爆火原因分析同类型游戏对比和游戏继承性地铁跑酷掘地求升跳跳乐 总结 介绍 游戏玩法 这是一个玩法很简单的跑酷游戏&#xff0c;你必须找到一条可行的道路&#xff0c;一直往上走…

【C++】哈希的应用

文章目录 一、位图1. 位图的引入2. 位图的实现3. 位图的应用4. 哈希切割 二、布隆过滤器1. 布隆过滤器的引入2. 布隆过滤器的实现3. 布隆过滤器的应用4. 布隆过滤器的总结 一、位图 1. 位图的引入 我们先来看一道面试题&#xff1a; 给40亿个不重复的无符号整数&#xff0c;没…

vue项目用iframe嵌入另外一个vue项目(cesium)

vue项目用iframe 项目嵌入另外一个vue项目&#xff0c;主要分2种情况&#xff0c;一种情况是嵌入本地项目&#xff0c;另外一种是嵌入用web服务器启动的vue项目。 1&#xff09;嵌入本地项目 vue create hello-world 创建项目后&#xff0c; 用npm run build打包&#xff0c;把…

IPO观察丨健身器材行业加“数”前行,康力源如何重构竞争壁垒?

近年来&#xff0c;健身器材市场的火热&#xff0c;引来了资本的广泛关注。数据显示&#xff0c;2021年中国健身器材市场规模为546.5亿元&#xff0c;同比增长15%&#xff0c;预计2024年或可达到799.6亿元。在这股浪潮之下&#xff0c;多家健身器材企业递出了IPO申请。比如&…

安装mmdetection(windows下)

windows环境安装mmdetection 创建pytorch环境最终安装的版本信息安装过程step1&#xff1a;安装mmcv-fullstep2&#xff1a;安装mmdetection 创建pytorch环境 mmdetection是基于PyTorch、CUDA环境来安装的&#xff0c;所以首先得安装深度学习pytorch环境、参考我的这篇pytorch…

基于企业微电网平台的食用菌工厂的能源管理

摘要&#xff1a;从食用菌生产经营者角度指出食用菌工厂化生产的产品生鲜属性、微生物培养的技术特点和竞争战略难以突破决定了成本控制是经营的核心。分析食用菌生产的成本构成&#xff0c;指出加强能源管理是节本增效的重要途径&#xff0c;从电费的分类和改善方式、灭菌的燃…

JDK的安装配置

MySQL的安装下载已经有很多码友阅读和提出意见&#xff0c;谢谢大家的肯定和批评&#xff0c;如下给出JDK的安装配置&#xff0c;如有帮助&#xff0c;点赞收藏加关注&#xff0c;如有不足或者错误&#xff0c;敬请批评指正&#xff01;&#xff01; 一、下载JDK 1、Oracle官网…

别百度了,低代码开发平台我推荐它

“低代码开发平台”指的是一种用于快速设计和开发软件系统&#xff0c;且手写代码量最少的方法&#xff0c;它可以帮助您更快、更可靠地提供价值。 随着疫情的发生&#xff0c;低代码平台在最近两年都成为互联网界的新宠&#xff0c;那为何会如此受欢迎呢&#xff1f;主要有以下…

MySQL主备延迟的原因

MySQL主备延迟的原因 在上篇文章中记录了一次由主备延迟导致的relay log打满磁盘的问题&#xff0c;结合林奇大佬的《MySQL是怎么保证高可用的&#xff1f;》&#xff0c;分析一下主备延迟的原因。 主备同步 主库和备库之间的同步流程如图所示&#xff1a; 在备库B 上通过c…

人脸考勤签到基础篇

目录 创建小程序底部Tab导航 开通腾讯云对象存储服务 一、静态资源要放在网上 二、为什么不选择阿里云或者华为云的对象存储服务&#xff1f; 二、开通腾讯云对象存储服务 三、存储静态资源 设计首页的英雄区和栏目导航 设计人脸签到页面 实现签到自拍功能 缓存系统常…

HTTP调用:你考虑到超时、重试、并发了吗?

今天&#xff0c;我们一起聊聊进行 HTTP 调用需要注意的超时、重试、并发等问题。 与执行本地方法不同&#xff0c;进行 HTTP 调用本质上是通过 HTTP 协议进行一次网络请求。网络请求必然有超时的可能性&#xff0c;因此我们必须考虑到这三点&#xff1a; 首先&#xff0c;框架…

单例模式(Singleton)

定义 单例是一种创建型设计模式&#xff0c;让你能够保证一个类只有一个实例&#xff0c;并提供一个访问该实例的全局节点。 前言 1. 问题 单例模式同时解决了两个问题&#xff0c;所以违反了单一职责原则&#xff1a; 保证一个类只有一个实例。为该实例提供一个全局访问节…

react签字功能 react-signature-canvas

react签字功能 react-signature-canvas . 前几天一个月薪35k的兄弟&#xff0c;给我推了一个人工智能学习网站&#xff0c;看了一段时间挺有意思的。包括语音识别、机器翻译等从基础到实战都有&#xff0c;很详细&#xff0c;分享给大家。大家及时保存&#xff0c;说不定啥时…

【MOOC 作业】第4章 网络层

不是标答也不是参考答案 仅从个人理解出发去做题 1、(20分) 考虑如图示的网络。 a. 假定网络是一个数据报网络。显示路由器 A 中的转发表&#xff0c;其中所有指向主机 H3 的流量通过接口 3 转发。 目的网络链路接口H33 b. 假定网络是一个数据报网络。你能写出路由器 A 中的…