CMake笔记之将任意官方库作为third_party完整地包含在工程项目中使用的通用模板

CMake笔记之将任意官方库作为third_party完整地包含在工程项目中使用的通用模板

在这里插入图片描述

—— 杭州 2024-03-20 凌晨1:06


在这里插入图片描述

code review!

文章目录

  • CMake笔记之将任意官方库作为third_party完整地包含在工程项目中使用的通用模板
    • 1.通用CMakeLists.txt模板
    • 2.GPT4给出的改进建议
    • 3.git clone或apt-get install的官方库,以zlib库为例
      • 3.1.获取zlib库
      • 3.2.找到头文件和库文件的位置并拷贝至工程项目
      • 3.3.CMakeLists.txt
      • 3.4.此时的文件结构
      • 3.5.main.cpp
      • 3.6.编译运行
    • 4.简单地将克隆的git clone下的目录放在项目树中的某个位置,以Google Test为例
      • 4.1.git clone
      • 4.2.CMakeLists.txt
      • 4.3.main.cpp
      • 4.4.编译运行
    • 5.在CMakeLists.txt文件中执行git clone(略,个人没用过,但知道有这个方法)
    • 6.找到该库的头文件(用于编译时包含)和链接库(用于链接时使用)的方法
    • 7.包含可执行文件的库,如protobuf移植到自己的项目文件夹中
      • 7.1.找到可执行文件和lib文件夹的路径
      • 7.2.创建third_party目录
      • 7.3.拷贝相关文件
      • 7.4.文件结构
      • 7.5.CMakeLists.txt
      • 7.6.main.cpp
      • 7.7.hello.proto
      • 7.8.编译运行
      • 7.9.在build文件夹内可以找到编译出来的pb.cc和pb.h

1.通用CMakeLists.txt模板

在这里插入图片描述

代码

# 设置CMake的最低版本要求
cmake_minimum_required(VERSION 3.0)

# 设置项目名称和版本
project(MyProject)

# 设置C++标准
set(CMAKE_CXX_STANDARD 11)

# 假设你的库文件名为libmylibrary.a (静态库) 或 libmylibrary.so (动态库)
# 并且库文件位于项目的third_party目录下

# 添加自己的库的头文件目录
include_directories(${PROJECT_SOURCE_DIR}/third_party/mylibrary/include)

# 添加自己的库的库目录
link_directories(${PROJECT_SOURCE_DIR}/third_party/mylibrary/lib)

# 指定生成目标
add_executable(${PROJECT_NAME} src/main.cpp)

# 链接库到你的可执行文件
target_link_libraries(${PROJECT_NAME} mylibrary)

2.GPT4给出的改进建议

这个CMakeLists.txt文件看上去基本是正确的,但是有几个小地方可能需要根据具体情况进行调整。以下是一个加了注释和可能需要注意的地方的版本:

# 设置CMake的最低版本要求
cmake_minimum_required(VERSION 3.0)

# 设置项目名称和版本
project(MyProject VERSION 1.0.0) # 如果你需要指定版本号,应该这样设置

# 设置C++标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True) # 确保使用了C++11

# 假设你的库文件名为libmylibrary.a (静态库) 或 libmylibrary.so (动态库)
# 并且库文件位于项目的third_party目录下

# 添加自己的库的头文件目录
include_directories(${PROJECT_SOURCE_DIR}/third_party/mylibrary/include)

# 添加自己的库的库目录
# 注意: 在现代CMake中,更推荐使用target_link_directories和target_link_libraries结合使用
# link_directories应该尽量避免使用,因为它是全局的,会影响所有的target
link_directories(${PROJECT_SOURCE_DIR}/third_party/mylibrary/lib)

# 指定生成目标
add_executable(${PROJECT_NAME} src/main.cpp)

# 链接库到你的可执行文件
# 如果mylibrary是第三方库,且你没有使用add_subdirectory或find_package来包含它,
# 你可能需要使用find_library来查找库文件的确切位置
target_link_libraries(${PROJECT_NAME} mylibrary)

注意事项:

  1. 如果你有多个版本的mylibrary库,并且希望确保链接到正确的版本,可能需要更详细地指定库文件的路径或版本。
  2. 如果mylibrary是动态链接库,确保在运行时它可以在系统的库路径中找到,或者设置LD_LIBRARY_PATH环境变量等。
  3. 如果是跨平台项目,一些路径可能需要根据操作系统进行调整,例如使用CMAKE_PREFIX_PATH
  4. 现代CMake推荐使用target-specific命令如target_include_directoriestarge

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kubernetes负载均衡-service

一、service的概念 1、什么是service 在Kubernetes中,pod是应用程序的载体,当我们需要访问这个应用时,可以通过Pod的IP进行访问,但是这里有两个问题:1、Pod的IP地址不固定,一旦Pod异常退出、节点故障,则会…

Windows11 安装confluence 7.4.0

Windows11安装confluence:7.4.0 1.打开终端管理员(管理员权限的PowerShell)2.按顺序执行以下命令,安装confluence服务3.浏览器(如Microsoft Edge) 打开 http://127.0.0.1:8100/ 配置confluence4.图示 本文是Windows11 安装confluence 7.4.0的步骤 本文参考 1.打开终端管理员(管…

使用React搭建single-spa

自己搭建的Demo GitHub - ftao123/single-spa-react-demo: single-spa-react-demo 修改子应用的webpack配置 library: "app2"和libraryTarget: "umd"配置必须添加。 可以看到filename在开发环境下的地址是static/js/bundle.js,所以我们主应用…

PySide6-YOLO8目标检测、追踪可视化界面

目录 项目地址实现效果DetectTrack 项目地址 https://github.com/zhengjie9510/pyside-yolo 实现效果 Detect Track

MySQL 查询性能优化

优质博文:IT-BLOG-CN​ 如果把查询看作是一个任务,那么它由一些列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数。通常…

matlab批量读取目录下的文件的方法

批量处理可以提高效率,这里提供一个可以批量读取nc文件的代码: address C:\Users\Hello World!!\DESKTOP\TerraClimate_ppt\; % Get the list of files udir address; form *.nc; % Get the list of station names files GetFiles(udir,form); [n,p…

Linux 进程通信:命名管道、共享内存

目录 一、命名管道 1、概念 2、特点 3、原理 4、创建 5、匿名管道与命名管道的区别 6、命名管道的打开规则 二、命名管道—实现客户端和服务器之间的通信 1、Makefile 2、comm.hpp 3、Log.hpp 4、server.cxx 5、client.cxx 运行测试: 三、system V…

模拟实现 atoi 函数

一、函数介绍 原型 int atoi(const char *nptr); 二、使用atoi 三、使用发现 可以发现:会先过滤掉空格,还能识别正负号,当第一次遇到正负号了,后面没接着是数字就返回0, 如果45 5aa 结果是45,说明前面识…

JavaScript代码执行原理

JavaScript代码是如何被机器理解并执行的呢? 作为 JavaScript 开发者,通常我们不需要关心JavaScript引擎是如何执行代码的。但是,了解 JavaScript 引擎的工作原理,知晓它如何处理我们编写的 JS 代码、肯定是有益的。 注意&#…

面试算法-94-将有序数组转换为二叉搜索树

题目 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视…

微服务之Nacos配置管理

文章目录 前言一、统一配置管理Nacos操作二、统一配置管理java操作1.引入依赖2.创建配置文件3.测试4.总结 三、Nacos配置自动更新1.添加注解RefreshScope2.使用ConfigurationProperties注解3.总结 四、Nacos多环境配置共享1.配置文件2.多种配置的优先级3.总结 总结 前言 一、统…

飞鸟写作能用吗 #笔记#笔记

飞鸟写作是一个强大的论文写作工具,不仅可以帮助用户高效、准确地完成论文写作,还能帮助用户对论文进行查重和降重。那么,飞鸟写作能用吗?答案是肯定的,飞鸟写作非常好用! 首先,飞鸟写作拥有强大…

2024智能EDM邮件营销系统使用攻略

在数字化营销领域,智能EDM(Electronic Direct Mail)邮件营销作为一种高效、精准的推广方式,正日益受到企业的高度重视。而要实现这一策略的成功落地,一个高可靠性和高稳定性的专业邮件发送平台则是不可或缺的关键环节。…

Nginx 故障排查之斜杠(/) --(附 Nginx 常用命令)

问题场景: 项目中用到了多个子域名,测试环境通过子域名进行接口访问的时候返回 404 NOT_FOUND,经过排查测试后确定是 Nginx 配置问题,而导致事故的根本原因是运维在Nginx配置的时候少配置了一个斜杠(/)&am…

Qt播放音乐代码示例

主界面 点击play按钮播放或暂停音乐,拖动进度条,音乐对应播放。 QWidget window;QPushButton* playButton new QPushButton("Play");// Qt 播放音乐// 创建 QMediaPlayer 对象QMediaPlayer* player new QMediaPlayer;// 指定音频文件的路径…

【IIS】应用程序池“xxxx”将被自动禁用,原因是为此应用程序池提供服务的进程中出现一系列错误。

应用程序池“xxxx”将被自动禁用,原因是为此应用程序池提供服务的进程中出现一系列错误。 发现其他网站是正常访问,对比发现路径凭据身份差异,这个网站指定用户访问,因为是物理机P2V到虚拟机上的。调整为应用程序用户,…

双系统安装04--在已有统信UOS基础上安装Windows10

原文链接:双系统安装04–在已有统信UOS基础上安装Windows10 Hello,大家好啊!继我们之前的双系统安装系列文章之后,今天我非常高兴地为大家介绍双系统安装的第四篇——在已有的统信桌面操作系统上安装Windows 10。这对于那些希望在…

k8s笔记27--快速了解 k8s pod和cgroup的关系

k8s笔记27--快速了解 k8s pod和 cgroup 的关系 介绍pod & cgroup注意事项说明 介绍 随着云计算、云原生技术的成熟和广泛应用,K8S已经成为容器编排的事实标准,学习了解容器、K8S技术对于新时代的IT从业者显得极其重要了。 之前在文章 docker笔记13–…

Excel通过下拉菜单,显示不同图片

背景:有的时候需要通过更改下拉菜单来改变对应的 值/ 图片。 如果是数值的话就是我们常常用的Vlookup,这个可以很简单的实现这个功能。(这个如果不知道请自行百度) 但是如果是图片呢?这个就不常见了,那么…

我的创作纪念日——命运之光来到CSDN的第365天

目录 前言 机缘 最初成为创作者的初心 实战项目中的经验分享 日常学习过程中的记录 通过文章进行技术交流 收获 在创作的过程中都有哪些收获 获得了多少粉丝的关注 获得了多少正向的反馈,如赞、评论、阅读量等 认识和哪些志同道合的领域同行 日常 当前创…