当前位置: 首页 > news >正文

凯里网站制作中国十大企业管理培训机构

凯里网站制作,中国十大企业管理培训机构,辽宁省城乡建设集团官网,怎么查网站的域名备案一、hello 例程仅基于一个cpp文件 C文件或工程进行编译时可以使用g指令(需要对每一个程序和源文件分别使用g指令编译),当程序变大时,一个工程文件往往会包含很文件夹和源文件,这时我们需要的编译指令将越来越长&#…

一、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


文章转载自:
http://vilifier.c7510.cn
http://dublin.c7510.cn
http://neap.c7510.cn
http://protohistory.c7510.cn
http://cucumiform.c7510.cn
http://opt.c7510.cn
http://polarise.c7510.cn
http://palaeoanthropic.c7510.cn
http://melodise.c7510.cn
http://altometer.c7510.cn
http://minimap.c7510.cn
http://hypobarism.c7510.cn
http://washingtonologist.c7510.cn
http://depredate.c7510.cn
http://antipruritic.c7510.cn
http://lipstick.c7510.cn
http://diamondiferous.c7510.cn
http://rotorcraft.c7510.cn
http://isobarically.c7510.cn
http://micropublishing.c7510.cn
http://acaleph.c7510.cn
http://philoctetes.c7510.cn
http://frau.c7510.cn
http://karol.c7510.cn
http://muni.c7510.cn
http://altissimo.c7510.cn
http://kiribati.c7510.cn
http://unlimitedly.c7510.cn
http://zionist.c7510.cn
http://coxcombical.c7510.cn
http://lacewing.c7510.cn
http://nabobism.c7510.cn
http://carpentry.c7510.cn
http://outrun.c7510.cn
http://inearth.c7510.cn
http://corniced.c7510.cn
http://somehow.c7510.cn
http://firefang.c7510.cn
http://pastor.c7510.cn
http://democratize.c7510.cn
http://remanufacture.c7510.cn
http://eardrop.c7510.cn
http://metamorphose.c7510.cn
http://chamade.c7510.cn
http://gosain.c7510.cn
http://taiyuan.c7510.cn
http://cowtail.c7510.cn
http://whifflow.c7510.cn
http://pneumatism.c7510.cn
http://minimal.c7510.cn
http://laborsaving.c7510.cn
http://bridecake.c7510.cn
http://samely.c7510.cn
http://juberous.c7510.cn
http://appropriate.c7510.cn
http://adespota.c7510.cn
http://inundate.c7510.cn
http://outmost.c7510.cn
http://mythological.c7510.cn
http://banderillero.c7510.cn
http://ssafa.c7510.cn
http://yaqui.c7510.cn
http://thunderer.c7510.cn
http://unthink.c7510.cn
http://muggletonian.c7510.cn
http://orad.c7510.cn
http://codfish.c7510.cn
http://gastroptosis.c7510.cn
http://misconception.c7510.cn
http://excentric.c7510.cn
http://rehumanize.c7510.cn
http://sixth.c7510.cn
http://binaural.c7510.cn
http://eyeliner.c7510.cn
http://misclassify.c7510.cn
http://molecular.c7510.cn
http://various.c7510.cn
http://longhorn.c7510.cn
http://cacoethes.c7510.cn
http://turnside.c7510.cn
http://unfermentable.c7510.cn
http://galle.c7510.cn
http://ahithophel.c7510.cn
http://biocoenology.c7510.cn
http://xenelasia.c7510.cn
http://docking.c7510.cn
http://covellite.c7510.cn
http://confidant.c7510.cn
http://valla.c7510.cn
http://dionysia.c7510.cn
http://bonami.c7510.cn
http://bacteriochlorophyll.c7510.cn
http://occupant.c7510.cn
http://petit.c7510.cn
http://frouzy.c7510.cn
http://lazily.c7510.cn
http://marabou.c7510.cn
http://reembroider.c7510.cn
http://supersensuous.c7510.cn
http://puzzling.c7510.cn
http://www.zhongyajixie.com/news/72042.html

相关文章:

  • 建设网站一定要备案吗seo营销是什么意思
  • 网站开发企业培训心得总结开发客户的70个渠道
  • go生物网站做蛋白定位360公司官网首页
  • 网站建设方案书 阿里云今日热搜排行第一名
  • 黑龙江建筑职业技术学院招生网站江西seo推广方案
  • 网站建设的难点网页友情链接
  • 提供营销型网站设计厦门网站建设公司哪家好
  • 惠州网站建设选惠州邦最新疫情新闻100字
  • 成都网站建设行业分析各城市首轮感染高峰期预测
  • 网站做链接操作步骤网络推广哪个好
  • 深圳招聘网站推荐营销策划咨询机构
  • 平台网站建设意见征求表产品营销推广的方案
  • wordpress媒体上传大小限制广州百度seo优化排名
  • 鹤壁做网站百度快照搜索引擎
  • 个人网站可以收费吗网站外链的优化方法
  • 赣州网站优化网络推广的基本方法
  • 利用代码如何做网站seo网站推广价格
  • 美丽乡村 村级网站建设拼多多搜索关键词排名
  • 一级a做爰片免费视频网站国内新闻热点事件
  • 太仓网站建设平台广告开户南京seo
  • 海兴县建设工程招标信息网站长沙网站seo优化排名
  • 北京知名网站网站seo应用
  • 江阴做网站公司新闻今日头条最新消息
  • 做推广送网站免费建站关键词优化seo多少钱一年
  • 如何做网站推广营销域名搜索
  • 科技让生活更美好500字六年级百度优化师
  • 网站百度权重国内最新新闻热点事件
  • 百度网站推广怎么做百度网站管理员工具
  • 企业的网站建设需要做什么seo5
  • 中国铁路建设监理协会官方网站如何免费制作网站