首页 >> 大全

gcc生成静态库.a和动态库.so和OpenCV3.4.11的安装及使用示例

2023-08-08 大全 32 作者:考证青年

gcc生成静态库.a和动态库.so和.4.11的安装及使用示例

文章目录 (二)实例使用库 二、.4.11的安装及使用示例 (三)、使用示例——图片(四)、使用示例——视频 三、总结四、参考文献:

一、用gcc生成静态库和动态库

函数库分为静态库和动态库。

静态库

在程序编译时会被连接到目标代码中,程序运行是则不需要静态库的存在。

动态库

在程序编译时不会被连接到目标代码中,而是程序运行时载入的。

两者区别:前者是编译连接的,后者是程序运行载入的。

(一)hello实例使用库 1.准备过程

(1). 创建一个目录

(2). hello代码

hello.h

#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif//HELLO_H

hello.c

#include
void hello(const char *name)
{printf("Hello %s\n",name);
}

main.c

#include"hello.h"
int main()
{hello("everyone");return 0;
}

(3). gcc编译得到.o文件

gcc -c hello.c

2. 静态库使用

(1)创建静态库

创建静态库的工具:ar

静态库文件命名规范:以lib作为前缀,是.a文件

ar -crv .a hello.o

(2)程序中使用静态库

①gcc -o hello main.c -L. -

②gcc main.c .a -o hello

③先生成main.o gcc -c main.c

生成可执行文件 gcc -o hello main.c .a

(3)验证静态库的特点

在删掉静态库的情况下,运行可执行文件,发现程序仍旧正常运行,表明静态库跟程序执行没有联系。同时,也表明静态库是在程序编译的时候被连接到代码中的。

3.动态库的使用

(1). 创建动态库

创建动态库的工具:gcc

动态库文件命名规范:以lib作为前缀,是.so文件

gcc - -fPIC -o .so hello.o

(2). 在程序中执行动态库

gcc -o hello main.c -L. -或gcc main.c .so -o hello

再运行可执行文件hello,会出现错误

问题的解决方法:将.so复制到目录/usr/lib中。由于运行时,是在/usr/lib中找库文件的。

mv .so /usr/lib

4.静态库与动态库比较

gcc编译得到.o文件 gcc -c hello.c

创建静态库 ar -crv .a hello.o

创建动态库 gcc - -fPIC -o .so hello.o

使用库生成可执行文件 gcc -o hello main.c -L. -

执行可执行文件 ./hello

————————————————

版权声明:本文为CSDN博主「」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

(二)实例使用库 1.代码

sub1.c

float x2x(int a,int b)
{float c=0;c=a+b;return c;
}

sub2.c

float x2y(int a,int b)
{float c=0;c=a/b;return c;
}

sub.h

#ifndef SUB_H
#define SUB_H
float x2x(int a,int b);
float x2y(int a,int b);
#endif

main.c

#include
#include"sub.h"
void main()
{int a,b;printf("Please input the value of a:");scanf("%d",&a);printf("Please input the value of b:");scanf("%d",&b);printf("a+b=%.2f\n",x2x(a,b));printf("a/b=%.2f\n",x2y(a,b));
}

gcc -c sub1.c sub2.c

2.静态库

ar crv .a sub1.o sub2.o

gcc -o main main.c .a

3.动态库

gcc - -fPIC -o .so sub1.o sub2.o

gcc -o main main.c .so

4.静态库与动态库生成文件比较

动态库转静态库_动态库和静态库的使用_

静态库

动态库

通过比较发现静态库要比动态库要小很多,生成的可执行文件大小也存在较小的差别。

二、.4.11的安装及使用示例 (一)、认识

开源计算机视觉()是一个主要针对实时计算机视觉的编程函数库。

的应用领域包括:

2D和3D功能工具包

运动估计

面部识别系统

手势识别

人机交互

移动机器人

动作理解

物体识别

分割和识别

实体影像立体视觉:来自两个摄像机的深度感知

运动中的结构(SFM)

运动跟踪

增强现实

为了支持上述一些领域,包括一个统计机器学习库,其中包含:

提升()

决策树学习

梯度提升树

期望最大化算法

k最近邻算法

朴素贝叶斯分类器

人工神经网络

随机森林

支持向量机(SVM)

深层神经网络(DNN)

(二)、安装 1)安装包

①下载 3.4.11 数据包

国内快速下载地址:

直接在虚拟机中的浏览器下载

②解压缩包

在解压缩包之前,将 -3.4.11.zip 复制到 home 文件夹下,再解压缩。

③使用 cmake 安装

首先进入解压后的文件夹:-3.4.11

cd -3.4.11

在进入 root 用户,并更新一下。

1| sudo su

2| sudo apt-get

接着再执行这条命令安装 cmake 。

sudo apt-get cmake

复制下面这条命令,安装依赖库。

sudo apt-get build- .0-dev -dev -dev .dev .dev -dev -dev

再创建 build 文件夹。

mkdir build

然后进入我们创建的文件夹:build

cd build

使用 cmake 编译参数,或者使用第二条默认参数,都可以的。

1 | cmake -D = -D =/usr/local …

2 | cmake …

④使用 make 创建编译

仍然是在 build 文件夹下进行。

sudo make

注:单线程编译:sudo make ,这会等待比较长的时间,如果你想更快编译完,可以使用命令:sudo make -j4 ,而 -j4 表示使用 4 个线程进行编译。

编译完成

⑤安装

sudo make

安装过程中没有报错,即可安装完成。

2)配置环境

修改 .conf 文件,打开后的文件是空的,添加 库的安装路径:/usr/local/lib

sudo gedit /etc/ld.so.conf.d/.conf

保存后会看到之前的警告信息,不用担心,正常情况。

更新系统共享链接库

sudo

配置 bash ,修改 bash. 文件

sudo gedit /etc/bash.

在文件末尾加入:

=$:/usr/local/lib/

保存退出,然后执行如下命令使得配置生效

/etc/bash.

更新一下。

sudo

接下来查看 的版本信息。

pkg- --

这下终于安装成功了!!!

(三)、使用示例——图片

首先创建一个代码存放文件夹 code ,然后进入文件夹中。

1 | touch code

2 | cd code

创建一个 test1.cpp 文件。

gedit test1.cpp

将下面的代码复制粘贴进去。

test1.cpp:

#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{CvPoint center;double scale = -3; IplImage* image = cvLoadImage("lena.jpg");argc == 2? cvLoadImage(argv[1]) : 0;cvShowImage("Image", image);if (!image) return -1; 	center = cvPoint(image->width / 2, image->height / 2);for (int i = 0;i<image->height;i++)for (int j = 0;j<image->width;j++) {double dx = (double)(j - center.x) / center.x;double dy = (double)(i - center.y) / center.y;double weight = exp((dx*dx + dy*dy)*scale);uchar* ptr = &CV_IMAGE_ELEM(image, uchar, i, j * 3);ptr[0] = cvRound(ptr[0] * weight);ptr[1] = cvRound(ptr[1] * weight);ptr[2] = cvRound(ptr[2] * weight);}Mat src;Mat dst;src = cvarrToMat(image);cv::imwrite("test.png", src);cvNamedWindow("test",1);  	imshow("test", src);cvWaitKey();return 0;
}

编译文件:

执行以下命令:

g++ test1.cpp -o test1 pkg- -- --libs

在用同文件夹下准备一张图片,文件名为:lena.jpg

输出结果:

执行以下命令:

./test1

可以看到由 lena.jpg 生成了一个 test.png ,呈现的效果不同了。

(四)、使用示例——视频 1)虚拟机获取摄像头权限

在下使用快捷键 Win + R ,输入 .msc ,并回车

找到 USB S… 服务,确保启动了。

点击 “ 虚拟机 ” ,然后点击 “ 设置(S)… ”。选择 “ USB控制器 ” ,将 “ USB兼容性 ” 设置为 “ USB 3.1 ” (有些是设置为USB 3.0),并点击确定。

选择 “ 虚拟机 ” ,再选择 “ 可移动设备 ” ,再选择 “” ,最后点击 “ 连接 ” ,再弹出的窗口内点击 “ 确定 ” 。这里不同的版本有不同的方法。具体版本可百度。

虚拟机右下角这个摄像头图标有个小绿点,则连接成功。

2)播放视频

创建一个 test2.cpp 文件。

gedit test2.cpp

将以下代码复制粘贴进去。

test2.cpp:

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{//从摄像头读取视频VideoCapture capture("man.mp4");//循环显示每一帧while(1){Mat frame;//定义一个Mat变量,用于存储每一帧的图像capture >> frame;//读取当前帧if(frame.empty())//播放完毕,退出break;imshow("读取视频帧",frame);//显示当前帧waitKey(30);//掩饰30ms}system("pause");return 0;
}

准备一个小视频,我这里准备了 man.mp4 。

编译 test2.cpp 文件。

g++ test2.cpp -o test2 pkg- -- --libs

输出结果。

./test2

3)录制视频

创建一个 test3.cpp 。

gedit test3.cpp

复制粘贴一下代码。

test3.cpp:

/*********************************************************************
打开电脑摄像头,空格控制视频录制,ESC退出并保存视频RecordVideo.avi
*********************************************************************/
#include<iostream>
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;int main()
{//打开电脑摄像头VideoCapture cap(0);if (!cap.isOpened()){cout << "error" << endl;waitKey(0);return 0;}//获得cap的分辨率int w = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_WIDTH));int h = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_HEIGHT));Size videoSize(w, h);VideoWriter writer("RecordVideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25, videoSize);Mat frame;int key;//记录键盘按键char startOrStop = 1;//0  开始录制视频; 1 结束录制视频char flag = 0;//正在录制标志 0-不在录制; 1-正在录制while (1){cap >> frame;key = waitKey(100);if (key == 32)//按下空格开始录制、暂停录制   可以来回切换{startOrStop = 1 - startOrStop;if (startOrStop == 0){flag = 1;}}if (key == 27)//按下ESC退出整个程序,保存视频文件到磁盘{break;}if (startOrStop == 0 && flag==1){writer << frame;cout << "recording" << endl;}else if (startOrStop == 1){flag = 0;cout << "end recording" << endl;}imshow("picture", frame);}cap.release();writer.release();destroyAllWindows();return 0;
}

编译 test3.cpp 文件。

g++ test3.cpp -o test3 pkg- -- --libs

输出结果。

./test3

三、总结

本次作业使我了解了gcc生成静态库和动态库的方法,在做的过程中也遇到了困难,通过网上各位大佬的帮助解决了。同时学会了在下安装.4.11,并使用它,学会了读取图片,视频,并且学会了录制视频。对我帮助很大。

四、参考文献:

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了