linux上使用cmake编译的方法
一、hello 例程仅基于一个cpp文件
C++文件或工程进行编译时可以使用g++指令(需要对每一个程序和源文件分别使用g++指令编译),当程序变大时,一个工程文件往往会包含很文件夹和源文件,这时我们需要的编译指令将越来越长,整个编译过程会变得异常繁琐。因此对于C++项目,使用一些工程管理工具会更加高效。
cmake就是一个在工程上被广泛使用的C++工程管理工具,很多库都用cmake管理源代码,因此了解cmake的指令和过程是很重要的。
1.1 简单的例子直接调用
我们以编译一个简单的C++程序为例说明cmake的使用。
在Linux系统根目录下新建一个cppSpace文件夹,在该文件夹中新建一个HelloWorld.cpp文件
//这是一个实例文件
#include <iostream>
using namespace std;
int main()
{cout <<"Hello world!"<< endl;return 0;
}
在cppSpace文件夹下新建一个CMakeLists.txt文件(注意该文件的命名不能自己随便改,不然编译时会报错),打开该文件使用cmake语法编写一下内容。CMakeLists.txt文件作用是告诉cmake要对这个文件夹(cppSpace文件夹)下的文件做什么。
# 声明要求的cmake最低版本
cmake_minimum_required( VERSION 2.8 )# 声明一个cmake工程
project( HelloWorld )# 添加一个可执行程序
# 语法为: add_executable( 程序名 源代码文件 )
add_executable(Helloworld HelloWorld.cpp)
创建好上面两个文件。在 cppSpace下,创建一个build文件,并进行编译
# 新建一个中间目录 build
mkdir build
# 使终端进入该中间目录
cd build
# 使用cmake对工程进行编译(注意最后是两个"..",表示对上一层目录进行编译)
cmake ..
# 最后使用make指令进行编译
make
运行编译好的文件 。在build文件夹下执行 ./Helloworld

到此,最简单的仅仅使用一个cpp文件的基于cmake的编译就完成了。
1.2 带接口的基于python的调用
创建一个cpp,命名为tj.cpp
#include "string.h"
#include <iostream>
#include <sstream>
#include <stdio.h>
using namespace std;
extern"C" int addtest( int a ,int b);
int addtest( int a ,int b)
{cout<<a<<endl;cout<<b<<endl; return a+b;
}
创建CMakeLists.txt文件内容如下:
# cmake needs this line
cmake_minimum_required(VERSION 3.23.1)# Define project name
project(tj)add_library(tj SHARED tj.cpp)
使用py文件调用
from ctypes import *
import sys
dll_test = CDLL("/data/sdv2/tangjunjun/mmdet2.19/cmake/dll1/build/libtj.so")
a=dll_test.addtest(4,5)
print(a)
使用python调用so文件结果:

二、基于.h文件和.cpp文件的cmake编译的方法
一般来说,一个标准的C++项目包括三个文件夹和一个CMakeLists.txt。
include文件夹下存在以.h开头的头文件(头文件可能也会以.hh,.hpp开头)
src存放的往往是包括.cu,.cpp,.c为后缀的主文件
build文件夹是空的
CMakeLists.txt则编写相关的编译原则来实现编译效果。文件的放置的样子如下图所示:

下面举个例子,同时包含头文件,源文件进行cmake的编译
include/hello.h文件:
#pragma once // 只编译一次void printHello(); // 在.h文件申明函数
src/main.cpp文件
#include <iostream> //C++的头文件
#include "cpuHello.h" //该文件有prinHello函数的申明
int main()
{printHello();return 0;
}
void printHello() // printHello函数定义写在下面,如果该函数定义写在main函数前面,就不需要申明了
{std::cout << "hello world\n"<< std::endl;
}
CMakeLists.txt文件
cmake_minimum_required(VERSION 3.18) # CMake最低版本号要求
project(helloWorld) # 项目名字 # 设置C++标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 添加头文件搜索路径
include_directories(include) # 寻找./src下面所有.cpp为后缀的源文件,并且保存到SRC变量里面
file(GLOB_RECURSE SRC ./src/*.cpp) # 编译SRC变量存储的源文件,编译生成目标文件命名为hello
add_executable(hello ${SRC})
有了上面的三个文件以后,下面开始编译代码:
cd build进入build文件夹(注意build文件夹刚开始是一个空文件夹)
cmake ../这个命令会在build里面生成对应的Makefile以及其他文件
make这个命令会直接寻找build文件夹内的Makefile文件执行编译过程
上面三个命令结束以后build会产生一个hello的可执行文件,然后./hello就可以执行打印了。
我们注意到CMakeLists.txt里面只是定义了不同文件的位置以及编译方式,其实没有指定编译器,但是系统会自动根据这个CMakeLists.txt寻找编译器编译文件,这个就是CMakeLists.txt优越简单的地方。
如果涉及到多种.cu .c等文件,可以参考以下链接实现
https://zhuanlan.zhihu.com/p/690410193
三、使用opencv库的编译
创建了一个工程文件夹,在文件夹中创建三个目录 images、out、src 分别用来存放 需要处理和保存的图像,编译输出的可执行文件

进入src目录中,创建两个目录 include、source,和CMakeLists.txt 文件。其中source用来存放程序的源文件,include用于存放头文件。

整个工程的目录结构如下:

创建两个源文件 main.cpp 文件 ColChange.cpp 文件,存放在在source目录中,在include目录中创建 ColChange.h文件
main.cpp
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include "ColChange.h"//using namespace cv;
using namespace std;int main(int argc, char** argv )
{//读取图片,将图片存为Mat类的image实例中Mat image = imread("../images/123.jpg");if(image.empty()){printf("could not load image...\n");return -1;}//实例化一个QuickDemoQuickDemo qd;//qd.colorSpace_Demo(image);//qd.mat_creat_demo(image);qd.pixel_visit_demo(image);//创建窗口SSJ//cv::namedWindow("SSJ",WINDOW_FREERATIO);//在SSJ窗口上,显示图片//cv::imshow("SSJ", image);//显示状态阻塞cv::waitKey(0);return 0;
}
ColChange.cpp
#include "ColChange.h"/** Author:SSJ-xiaoguoke* Funtion:转换图像的色彩空间,transform the color space of the image*/
void QuickDemo::colorSpace_Demo(Mat &image)
{Mat gray,hsv;cvtColor(image,hsv,COLOR_BGR2HSV);cvtColor(image, gray,COLOR_BGR2GRAY);imshow("HSV",hsv);imshow("huidu",gray);imwrite("../images/hsv.jpg",hsv);imwrite("../images/gray.jpg",gray);}/** Author:SSJ-xiaoguoke* Funtion:创建Mat对象,Creating an image object*/
void QuickDemo::mat_creat_demo(Mat &image)
{Mat m1,m2;m1 = image.clone();image.copyTo(m2);/** Size(8,8):创建的矩阵尺寸为 8*8* CV_8UC1:8位 U:无符号unsigned C:char型 1:单通道*///Mat m3 = Mat::zeros(Size(8,8),CV_8UC1);/*三通道*/Mat m3 = Mat::zeros(Size(500,500),CV_8UC3);/*创建一个值全是1的矩阵*///Mat m3 = Mat::ones(Size(8,8),CV_8UC1);m3 = Scalar(0,0,255);//std::cout << m3 << std::endl;imshow("red",m3);}/** Author:SSJ-xiaoguoke* Funtion:像素操作,Pixel operations*/
void QuickDemo::pixel_visit_demo(Mat &image)
{int W = image.cols;int h = image.rows;int dims = image.channels();/*for(int row=0; row < h; row++){for(int col=0; col<W; col++){if(dims==1){int pv = image.at<uchar>(row,col);image.at<uchar>(row,col) = 255 - pv;}if(dims==3){Vec3b bgr = image.at<Vec3b>(row,col);image.at<Vec3b>(row,col)[0] = 255 - bgr[0];image.at<Vec3b>(row,col)[1] = 255 - bgr[1];image.at<Vec3b>(row,col)[2] = 255 - bgr[2];}}}*//*通过指针的方法实现*/for(int row=0;row < h; row++){uchar* current_row = image.ptr<uchar>(row);for(int col=0;col < W;col++){if(dims==1){int pv = *current_row;*current_row++ = 255-pv;}if(dims==3){*current_row++ = 255 - *current_row;*current_row++ = 255 - *current_row;*current_row++ = 255 - *current_row;}}}imshow("Pixel operations",image);}
ColChange.h
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;class QuickDemo {public:void colorSpace_Demo(Mat &image);void mat_creat_demo(Mat &image);void pixel_visit_demo(Mat &image);};
代码编写完成之后,进入src目录中,执行指令编译工程
1 cmake ./ 2 make
如果没有安装opencv则会报错,编译失败,需要先安装opencv。安装方法参考链接:OpenCV介绍及安装(linux)_linux opencv-CSDN博客
如果安装了opencv则会正常编译,编译完成之后会在out目录下输出一个叫 test的可执行文件。在image下面放一张图片 改名为123.jpg(可以修改代码来修改加载的图片名字)
进入out目录,执行下面的语句:
./test

相关文章:
linux上使用cmake编译的方法
一、hello 例程仅基于一个cpp文件 C文件或工程进行编译时可以使用g指令(需要对每一个程序和源文件分别使用g指令编译),当程序变大时,一个工程文件往往会包含很文件夹和源文件,这时我们需要的编译指令将越来越长&#…...
如何实现el-select多选下拉框中嵌套复选框并加校验不为空功能呢?
如何实现el-select多选下拉框中嵌套复选框并加校验不为空功能呢? 要实现的效果图选择部分品牌但不选选项效果问题概述实现方案el-select组件与el-checkbox组件无缝衔接给form表单加自定义校验规则 要实现的效果图 选择部分品牌但不选选项效果 问题概述 相信大家看到…...
源码理解 UE4中的 FCookStatsManager::FAutoRegisterCallback RegisterCookStats
官方文档:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/API/Runtime/Core/ProfilingDebugging/FCookStatsManager文档中的注释: When a cook a complete that is configured to use stats (ENABLE_COOK_STATS), it will broadcast this…...
Android 根据内存大小显示MTP模式连接PC时的名称
项目有两种内存,要求根据连接电脑拷贝文件时的盘符名称根据内存大小显示不同名称。 frameworks/base/media/java/android/mtp/MtpDatabase.java//mh import android.app.ActivityManager; ...-894,7 896,19 public class MtpDatabase implements AutoCloseable {p…...
不只是mini-react第一节:实现最简单mini-react
项目总结构: ├─ 📁core │ ├─ 📄React.js │ └─ 📄ReactDom.js ├─ 📁node_modules ├─ 📁tests │ └─ 📄createElement.spec.js ├─ 📄App.js ├─ 📄in…...
前端路由layout布局处理以及菜单交互(三)
上篇介绍了前端项目部署以及基本依赖的应用,这次主要对于路由以及布局进行模块化处理 一、 创建layout模块 1、新建src/layout/index.vue <template><el-container class"common-layout"><!-- <el-aside class"aside">&l…...
小结:DNS,HTTP,SMTP,IMAP,FTP,Telnet,TCP,ARP,ICMP
DNS(Domain Name System,域名系统) 是互联网的重要组成部分,它负责将人类易读的域名(如 www.google.com)转换为机器可以识别的 IP 地址(如 142.250.72.206)。这一过程被称为域名解析…...
【C++】P2550 [AHOI2001] 彩票摇奖
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式:输出格式:输入输出样例: 💯题解思路1. 问题解析 💯我的实现实现逻辑问题分析 💯老…...
并发服务器框架——zinx
zinx框架 Zinx 是一个用 Go 语言编写的高性能、轻量级的 TCP 服务器框架,它被设计为简单、快速且易于使用。Zinx 提供了一系列的功能,包括但不限于连接管理、数据编解码、业务处理、负载均衡等,适用于构建各种 TCP 网络服务,如游戏…...
Unity 中计算射线和平面相交距离的原理
有此方法 能够计算射线和平面是否相交以及射线起点到平面交点的距离 代码分析 var dot Vector3.Dot(ray.direction, plane.normal);计算射线和平面法线的点积,如果大于等于0,则说明射线和平面没有相交,否则,说明射线和平面相交…...
浅谈棋牌游戏开发流程七:反外挂与安全体系——守护游戏公平与玩家体验
一、前言:为什么反外挂与安全这么重要? 对于任何一款线上棋牌游戏而言,公平性和玩家安全都是最重要的核心要素之一。如果游戏环境充斥着各式各样的外挂、作弊方式,不仅会毁坏玩家体验,更会导致游戏生态崩塌、口碑下滑…...
《无力逃脱》V1.0.15.920(59069)官方中文版
艾丹是一名三臂赏金猎人,他必须追捕银河系中最危险、最难以捉摸的割喉者。 有些悬赏是金钱,有些则是有价值的信息。艾丹可以利用这些信息找到让他走上这条路的人,同时也会卷入一个全银河系的阴谋中。 拥有三条手臂可以让你同时对付更多的敌…...
六种主流服务器的选择与使用
网络的运行离不开各种服务器,它们各司其职,为我们提供稳定的网络服务。本文带大家了解6种常见服务器类型。 服务器的六大种类 第一种:Web服务器 Web服务器是互联网的核心。当你打开一个网站,比如百度或淘宝,浏览器会…...
TiDB 升级至高版本提示'mysql.tidb_runaway_watch' doesn't exist 问题处理
作者: asd80703406 原文来源: https://tidb.net/blog/90394c97 背景 近期发现很多人从低版本升级至TiDB v7 或者v8版本,均遇到了tidb-server启动失败,提示报错如下: ["get runaway watch record failed"…...
GRU-PFG:利用图神经网络从股票因子中提取股票间相关性
“GRU-PFG: Extract Inter-Stock Correlation from Stock Factors with Graph Neural Network” 论文地址:https://arxiv.org/pdf/2411.18997 摘要 股票预测模型可以分为两个主要类别:第一类,例如GRU和ALSTM,这些模型仅基于股票…...
数字化供应链创新解决方案在零售行业的应用研究——以开源AI智能名片S2B2C商城小程序为例
摘要: 在数字化转型的浪潮中,零售行业正经历着前所未有的变革。特别是在供应链管理方面,线上线下融合、数据孤岛、消费者需求多样化等问题日益凸显,对零售企业的运营效率与市场竞争力构成了严峻挑战。本文深入探讨了零售行业供应…...
安卓Activity执行finish后onNewIntent也执行了
测试反应投屏时下一集可能播放不成功。 首先看一下日志: onCompletion onCast handlerMessage: 2 finish: PlayerActivityabc7fdc onPause: PlayerActivityabc7fdc onNewIntent: PlayerActivityabc7fdc onResume: PlayerActivityabc7fdc onPause: PlayerActivityab…...
数据结构.期末复习.学习笔记(c语言)
《数据结构》复习概要 一、概论 二、基础1. 基本概念2. 四种逻辑结构及特点3. 算法的概念、特性4. 算法设计的4个要求 三、线性结构1.顺序表2.单链表3.循环链表双向链表4.栈(后进先出)5.队列(先进先出) 四、树和二叉树1.树2.二叉…...
Kafaka安装与启动教程
1.下载 先去官网Apache Kafka可以查看到每个版本的发布时间。选择你要安装的版本。 然后进入linux建立要存放的文件夹,用wget命令下载 2.安装 先解压缩: tar -xvzf kafka_2.12-3.5.1.tgz -C ../ 3.配置文件 修改server.properties: cd .…...
根据docker file 编译镜像
比如给到一个Dockerfile 第一步编译镜像 cd /path/to/Dockerfiledocker build -t <DOCKER_IMAGE_NAME> . build 命令编译镜像 -t 镜像名字 . 指dockerfile 所在目录 如果遇到报错 [] Building 0.3s (3/3) FINISHED …...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
