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

文章目录

  • gcc生成静态库.a和动态库.so和OpenCV3.4.11的安装及使用示例
    • 一、用gcc生成静态库和动态库
      • (一)hello实例使用库
        • 1.准备过程
        • 2. 静态库使用
        • 3.动态库的使用
        • 4.静态库与动态库比较
      • (二)实例使用库
        • 1.代码
        • 2.静态库
        • 3.动态库
        • 4.静态库与动态库生成文件比较
    • 二、OpenCV3.4.11的安装及使用示例
      • (一)、认识 OpenCV
      • (二)、安装OpenCV
        • 1)安装包
        • 2)配置环境
      • (三)、使用示例——图片
      • (四)、使用示例——视频
        • 1)虚拟机获取摄像头权限
        • 2)播放视频
        • 3)录制视频
    • 三、总结
    • 四、参考文献:

一、用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<stdio.h>
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 libmyhello.a hello.o

(2)程序中使用静态库
①gcc -o hello main.c -L. -lmyhello

②gcc main.c libmyhello.a -o hello

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

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

3.动态库的使用

(1). 创建动态库
创建动态库的工具:gcc
动态库文件命名规范:以lib作为前缀,是.so文件

gcc -shared -fPIC -o libmyhello.so hello.o

(2). 在程序中执行动态库
gcc -o hello main.c -L. -lmyhello或gcc main.c libmyhello.so -o hello
再运行可执行文件hello,会出现错误

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

mv libmyhello.so /usr/lib

4.静态库与动态库比较

gcc编译得到.o文件 gcc -c hello.c
创建静态库 ar -crv libmyhello.a hello.o
创建动态库 gcc -shared -fPIC -o libmyhello.so hello.o
使用库生成可执行文件 gcc -o hello main.c -L. -lmyhello
执行可执行文件 ./hello
————————————————
版权声明:本文为CSDN博主「HarrietLH」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43279579/article/details/109026927

(二)实例使用库

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<stdio.h>
#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 libsub.a sub1.o sub2.o
gcc -o main main.c libsub.a

3.动态库

gcc -shared -fPIC -o libsub.so sub1.o sub2.o
gcc -o main main.c libsub.so

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

静态库

动态库

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

二、OpenCV3.4.11的安装及使用示例

(一)、认识 OpenCV

开源计算机视觉(OpenCV)是一个主要针对实时计算机视觉的编程函数库。
OpenCV的应用领域包括:

2D和3D功能工具包
运动估计
面部识别系统
手势识别
人机交互
移动机器人
动作理解
物体识别
分割和识别
实体影像立体视觉:来自两个摄像机的深度感知
运动中的结构(SFM)
运动跟踪
增强现实
为了支持上述一些领域,OpenCV包括一个统计机器学习库,其中包含:

提升(Boosting)
决策树学习
梯度提升树
期望最大化算法
k最近邻算法
朴素贝叶斯分类器
人工神经网络
随机森林
支持向量机(SVM)
深层神经网络(DNN)

(二)、安装OpenCV

1)安装包

①下载 OpenCV 3.4.11 数据包
国内快速下载地址:https://www.bzblog.online/wordpress/index.php/2020/03/09/opencvdownload/
直接在虚拟机中的浏览器下载

②解压缩包

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


③使用 cmake 安装 opencv

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

cd opencv-3.4.11


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

1| sudo su
2| sudo apt-get update


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

sudo apt-get install cmake


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

sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev


再创建 build 文件夹。

mkdir build


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

cd build

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

1 | cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local …
2 | cmake …


④使用 make 创建编译

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

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

编译完成

⑤安装

sudo make install


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

2)配置环境

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

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


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

更新系统共享链接库

sudo ldconfig


配置 bash ,修改 bash.bashrc 文件

sudo gedit /etc/bash.bashrc


在文件末尾加入:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH


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

source /etc/bash.bashrc


更新一下。

sudo updatedb


接下来查看 opencv 的版本信息。

pkg-config --modversion opencv


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

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

首先创建一个代码存放文件夹 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-config --cflags --libs opencv


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

输出结果:
执行以下命令:

./test1


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

(四)、使用示例——视频

1)虚拟机获取摄像头权限

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

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

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

选择 “ 虚拟机 ” ,再选择 “ 可移动设备 ” ,再选择 “Camera” ,最后点击 “ 连接 ” ,再弹出的窗口内点击 “ 确定 ” 。这里不同的版本有不同的方法。具体版本可百度。
虚拟机右下角这个摄像头图标有个小绿点,则连接成功。

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-config --cflags --libs opencv


输出结果。

./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-config --cflags --libs opencv

输出结果。

./test3

三、总结

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

四、参考文献:

https://blog.csdn.net/qq_43279579/article/details/109026927
https://blog.csdn.net/ssj925319/article/details/109231145

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

  1. 用 gcc生成静态库和动态库以及静态库和动态库的使用

    文章目录 一.linux下gcc生成静态库和动态库以及库文件的使用 1.准备过程 2.静态库的创建及使用 (1)创建静态库 (2)程序中使用静态库 3.动态库的创建及使用 (1)创建动态库 (2)程序 ...

  2. gcc生成静态库.a和动态库.a以及Ubuntu18.04下opencv3.4.11安装及示例

    目录 一.用gcc生成静态库和动态库 (一)hello示例使用库 1.准备过程 2.静态库使用 3.动态库的使用 4.静态库与动态库比较 (二)示例1使用库 二.opencv安装以及使用 (一)认识o ...

  3. gcc生成静态库和动态库,以及OpenCV3.4.11的安装和实例

    文章目录 一.用gcc生成静态库和动态库 (1).hello使用库实例 1.创建目录并编写hello代码 2.gcc编译得到.o文件 3.静态库的使用 4.动态库的使用 5.静态库与动态库的对比 (2 ...

  4. 用gcc生成静态库和动态库和使用opencv库编写打开摄像头压缩视频

    文章目录 一.用gcc生成静态库和动态库 1.编辑生成程序hello.h.hello.c.main.c 2.将hello.c生成.o文件 3.使用静态库 4.动态库的使用 二.a与.so库文件的生成与 ...

  5. GCC生成静态库和动态库

    目录 1)阅读.理解和学习材料"用gcc生成静态库和动态库.pdf"和"静态库.a与.so库文件的生成与使用.pdf",请在Linux系统(Ubuntu)下如实 ...

  6. Linux下用gcc生成静态库和动态库及练习使用OpenCV

    我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为 静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而 ...

  7. 用gcc生成静态库和动态库.pdf以及opencv的使用

    一.gcc生成动态库和静态库 1.准备过程 创建hello.h文件并编写hello.h #ifndef HELLO_H #define HELLO_H void hello(const char *n ...

  8. linux库引入之动态库静态库(生成和使用)

    库: 库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容. 如何使用 用户需要同时具有头文件和库. ...

  9. go语言调用c 的头文件 so,Golang生成共享库(shared library)以及Golang生成C可调用的动态库.so和静态库.a...

    Golang类似于C的静态语言,效率也接近于C,如果Golang也可以导出可供C调用的库,那可以和很多高级语言say goodbye了,goodbye似乎又有点武断,但至少说,Golang可以做很多事 ...

最新文章

  1. AI和大数据如何落地智能城市?京东城市这6篇论文必读 | KDD 2019
  2. node(ActiveMq)
  3. js 用迭代器模式优雅的处理递归问题
  4. Confluence 6 配置服务器基础地址备注
  5. Ubuntu 20.10 Beta 版本发布
  6. three.js和php,详解three.js本地运行的方法
  7. Linux下部署MongoDB
  8. JDBC01 mysql和navicat的安装
  9. 蓝桥杯 错误票据——2013年省赛C/C++ A组
  10. linux硬盘安装卡住,linux硬盘安装问题
  11. bullmind在线流程图软件,在线visio软件
  12. 模拟c语言的软件下载,c语言软件下载(C/C++模拟学习)
  13. 炸弹人 炸弹爆炸 c语言_发展恐怖故事–邮件炸弹
  14. oracle表示大于等于,这些基础请记住,java转义的问题:小于等于、 大于等于Mybatis 、oracle...
  15. 维生素C对免疫力有什么影响?
  16. 小米手机MIUI关闭广告大全
  17. 一个男人最高的品味是他选择的女人
  18. GRPC、WCF、WebAPI性能比较
  19. Dart 2.13 版现已发布
  20. 2019聊大考研计算机调剂,聊城大学2019考研调剂信息

热门文章

  1. MySQL使用教程(基础篇01)
  2. Bean 依赖注入方式
  3. 中国矿业大学C语言作业,中国矿业大学C语言程序设计实验报告第5章.docx
  4. 在vue中使用nicescroll
  5. talend同步mysql_Talend初试,实现定时同步
  6. python开发工具pycharm-community版安装教程
  7. 2022年一级建造师考试《机电工程》每日一练及答案
  8. 高中职校计算机要不要学英语作文,职业高中对口高考英语作文写作之我见
  9. 文件读写r,rb,w,wb区别(对于换行符的处理)
  10. OAI 5G核心网安装并连接到gNB