一、关于在Linux中使用gcc生成静态库和动态库的练习;

1)静态库与动态库仿做:

第一步:编辑生成子程序hello.h、hello.c和main.c

先创建一个作业目录,保存本次练习的文件。

#mkdir test1

#cd test1

然后使用vim编辑生成所需的三个文件

程序1:hello.h

程序2:hello.c

程序3:main.c

第二步:将hello.c编译成.o文件,并使用ls查看是否生成hello.o文件

第三步:由.o文件创建静态库。

静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:将创建的静态库名为myhello,则静态库文件名就是libmyhello.a。创建静态库使用ar命令。

第四步:在程序中使用静态库。

制作了由hello.o生成的静态库myhello。在使用时需要在用到这些公用函数的源程序中包含这些公用函数的原型声明(在主程序main.c中*#include “hello.h”*该语句就算是声明),然后在用gcc命令生成目标文件时指明静态库名,gcc将会从静态库中将这些公用函数连接到目标文件中。注意:gcc会在静态库名前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件。

下面下生成目标程序hello,然后运行程序看结果。

第五步:由.o文件创建动态库文件。

动态库文件命名规范与静态库文件类似,在参数上略有差别。

下面生成动态库libmyhello2.so

第六步:在程序中使用动态库;

在程序中使用动态库和使用静态库完全一样;

可执行文件hello2的创建没有出错,在运行hello2的时候出错了,是因为动态库在程序编译时并不会被连接到代码中,而是在程序运行时才被载入,而此处报错是因为在运行时无法在/usr/lib目录下找到libmyhello2.so文件,所以通过将文件复制到/usr/lib目录下,且此处需要管理员权限才能复制,所以要加上sudo,即sudo mv libmyhello2.so /usr/lib,才能正常运行。

注:当静态库和动态库同名时,gcc命令(不指定某一个库时)会优先使用动态库,

2)静态库与动态库实作:

静态库:

使用vim编写x2x.h与x2x.c程序:


编写x2y.h与x2y.c程序:

编写main.c程序:

写好后使用ls查看文件:

使用ar将x2x和x2y生产静态库文件:

用gcc将main函数的目标文件与此静态库连接,生成最终的可执行文件,记录文件大小:

使用ls -l 文件名字即可查询文件大小

注:这里的main.c有警告但是影响不大

文件大小为8416Bit

动态库:

使用ar将x2x和x2y生产动态库文件:

用gcc将main函数的目标文件与此动态库连接,生成最终的可执行文件,记录文件大小:

可以看到动态库文件的大小为8360B是要比静态库小一些的

二、Linux GCC常用命令

1.简单编译:

test.c程序:

将其一步到位编译,并运行:

2.1 预处理

可以输出test.i文件,文件中存放着test.c经过预处理之后的代码。

gcc的-E选项,可以让编译器在预处理后停止,并输出预处理结果。在本例中,预处理结果就是将stdio.h文件中的内容插入到test.c中。

2.2 编译为汇编代码

预处理后,可以直接对生成的test.i文件编译,生成汇编代码。

gcc中的-S选项,表示在程序编译期间,在生成汇编代码后停止,-o输出汇编代码文件。

2.3汇编:

对于上一小节生成的汇编代码文件test.s,gas汇编器负责将其编译为目标文件,如下:

2.4连接:

gcc连接器是gas提供的,负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。

对于上一小节中生成的test.o将其与C标准输入输出库进行连接,最终生成test程序

3 多个程序文件的编译:

通常整个程序是由多个源文件组成的,相应的也就形成了多个编译单元,使用GCC能够很好的管理这些编译单元。假设有一个由test1.c和test2.c两个源文件组成的程序,为了对它们进行编译,并最终生成可执行文件,可以使用以下这条命令:

gcc test1.c test1.c -o test

以上命令会将test1.c与test2.c依次编译为.o文件在将二者编译为可执行文件test。

4 检错:

-pedantic

可以使用-pedantic来检错:gcc -pedantic illcode.c -o illcode

但-pedantic并不能找出全部的错误

-Wall

gcc -Wall illcode.c -o illcode

相较于-pedantic能够产生更多的警告

-Werror

gcc -Werror test.c -o test

加上-Werror会在所有产生警告的地方停止编译!

三、通过学习opencv图像库编程,了解如何借助第三方库函数完成一个综合程序设计。

1.安装opencv3.4.12

从网上下载opencv的压缩包,opencv-3.4.12.zip,将压缩包移动到home文件夹下使用命令解压:

unzip opencv-3.4.12.zip

2.使用cmake安装opencv

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

cd opencv-3.4.12

进入root用户,方便接下来的操作,并更新一下:

sudo su

sudo aot-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

我在安装libjaser-dev时出现了软件包无法定位的问题,执行以下命令的得到解决:

sudo add-apt-repository “deb http://security.ubuntu.com/ubuntu xenial-security main”
sudo apt update
sudo apt upgrade
sudo apt install libjasper1 libjasper-dev

然后使用mkdir创建build目录并使用cd进入目录:

mkdir build

cd build

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

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local …
cmake …

3.使用make创建编译

在build文件夹下进行:

sudo make -j4

这里的-j4表示用四个线程编译,可以更节省时间

编译完成:

4.安装

sudo make install

5.配置环境

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

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

保存后会看到之前的警告信息,是正常情况

更新系统共享链接库:

sudo ldconfig

配置bash,修改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

到此opencv-3.4.12就安装完成了

6.使用实例-图片

编写一个test1.c,将下面这段代码复制过去:

*#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;iheight;i++)
for (int j = 0;jwidth;j++) {
double dx = (double)(j - center.x) / center.x;
double dy = (double)(i - center.y) / center.y;
double weight = exp((dxdx + dydy)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.c -o test1 pkg-config --cflags --libs opencv

在同一文件夹下准备一张图片,文件名为:shot.png

7.使用实例-视频

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

使用快捷键Win+R,S输入service.msc回车

打开服务后找到,VMware USB Arbitration Servies服务,确保启动

点击虚拟机,然后点击“设置”,选择"USB控制器",将"USB兼容性"设置为"USB3.0",点击确定。

选择虚拟机,在选择可移动设备,在选择IMC Networks ov9734,最后点击连接,在弹出的窗口内点击确定

创建一个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;
}

准备一个视频文件

编译test2.cpp文件

2)录视频

创建一个test3.cpp文件

/*********************************************************************
打开电脑摄像头,空格控制视频录制,ESC退出并保存视频RecordVideo.avi
*********************************************************************/
#include
#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.cpp即可打开摄像头,空格录制,ESC退出并保存

关于gcc与opencv在Ubuntu的应用相关推荐

  1. linux使用交叉工具链产生的程序怎么下载到mini2440里,Ubuntu安装ARM架构GCC工具链(ubuntu install ARM toolchain)最简单办法...

    一.安装ARM-Linux-GCC工具链 只需要一句命令: sudo apt-get install gcc-arm-linux-gnueabi 前提是你的Ubuntu系统版本是官网支持的最新的版本, ...

  2. Opencv FFmpeg Ubuntu下编译问题

    FFmpeg转码错误Cannot load libcuda.so.1 https://blog.csdn.net/yzhang6_10/article/details/81349532 srs2.0 ...

  3. Linux ubuntu 装openCV,Linux(ubuntu 16.04) 安装 opencv C++

    Linux(ubuntu 16.04) 安装 opencv C++ Linux(ubuntu 16.04) 安装 opencv C++ 参考文档: https://blog.csdn.net/qq_3 ...

  4. 【OpenCV】Ubuntu配置OpenCV环境

    1.从官网下载opencv包拷贝到虚拟机Ubuntu中, 虚拟机与主机传输文件可以采用 vmware tool.共享文件夹或者远程连接工具 2.解压得到对应版本号文件夹,我的是opencv-3.4.2 ...

  5. OpenCV在Ubuntu下的图像编程

    文章目录 一.如何在Ubuntu下安装opencv 二.使用opencv打开一张图片 三.使用opencv打开摄像头 四.使用opencv打开一个视频文件 五.通过摄像头采集图像并压缩成视频 六.参考

  6. linux opencv移植教程,OpenCV在Ubuntu和Linux系统下的移植

    1安装cmake-qt-gui:sodo apt-get install cmake-qt-gui 2. 配置cmake: 进入存放opencv2.4.10的文件夹,输入cmake-gui.进入如下界 ...

  7. linux如何用gcc编译c程序,Ubuntu之如何使用gcc编译C语言程序

    在大学里面大家都用过VC6.0来进行编程.VC6.0属于集成开发环境,一份代码从文本变成可执行的程序只需要在其中点击几个按钮就行了,加之老师也只教过我们如何操作,并未介绍C语言的执行过程.上一篇曾提到 ...

  8. vs cmake opencv 远程 ubuntu 开发时:vs代码出现紫色波浪线且报错怎么办?

    解决办法: 先将cmake设置里的IntelliSense模式改成linux-gcc-x64 然后ctrl+s发现可能还是呈紫色且报错 接下来切换一下这里,在这两个之间切换,然后紫色波浪线和报错即可消 ...

  9. Installing OpenCV 2.4.9 in Ubuntu 14.04 LTS(好文章)

    原文链接 http://www.samontab.com/web/2014/06/installing-opencv-2-4-9-in-ubuntu-14-04-lts/ Installing Ope ...

最新文章

  1. Android 开发笔记 Google地图定位与路线显示
  2. elasticsearch索引和映射
  3. MOS2010的界面介绍和定制方法简介【资料汇集】
  4. {}企业如何才能实现多方位网络营销
  5. Mac安装metasploit-framework【亲测有用】
  6. C++Primer第5版学习笔记(一)
  7. CSS你可以不写,但这些规范必须要知道!
  8. java提取省市县乡镇村
  9. 每天一点matlab——字符分割
  10. 排版侠html怎么复制,排版侠| 3分钟完美编辑变排版达人
  11. 决策支持系统(DSS)
  12. html——链接跳转
  13. 在web of science / 知网 上生成题录
  14. 快速查毒及电脑防毒的解决方案
  15. pd.DataFrame()函数
  16. 中科世为 Z6S Linux HMI 屏幕模组上手记录 | 01 - 环境搭建
  17. 转载:软件天才与技术民工
  18. 韩信点兵--求分数序列前N项和--特殊a串数列求和--猜数字游戏
  19. 优秀的 Verilog/FPGA开源项目介绍(七)- CAN通信
  20. 这些数据知识库至少够你用10年(关键还免费)

热门文章

  1. 多张图片整合成连续动画的代码
  2. CSS样式中选择器+盒子模型+定位+浮动
  3. 2011孕妇奶粉排行榜
  4. 饥荒联机自建服务器有什么用,联机版饥荒使用专用服务器的好处 | 手游网游页游攻略大全...
  5. Suflo-Cyanine5.5 Tyramide,Suflo-Cyanine3 TSA,磺酸基-花青素Cy5 酪酰胺
  6. 新概念二册 Lesson 39 Am I all right?我是否痊愈?(复习直接引语变间接引语)
  7. sql EXPLAIN 详解 type\rows
  8. 区块连中文书六本略读
  9. spring cloud分布式微服务-大话Spring Cloud
  10. 外贸邮件营销用什么免费邮件群发平台好?