让VI成为记事本(5)在openeuler环境第一个C++程序 编写 编译 调试都离不开vi

1 篇文章 0 订阅
1 篇文章 0 订阅
  •  编译和调试环境

首先,你得有一台Linux机器,目前的开发环境是10.88.115.114,机器需要安装g++/gcc编译器环境,文本编辑器,如vim等,一般安装操作系统会安装好,如果系统没有需要自行安装。

输入g++ -v 查看本机是否安装g++环境

安装方式有两种,YUM安装和源代码安装方式。推荐使用YUM安装方式。

Yum安装可以自动解决库依赖问题,所以推荐使用。YUM安装g++:

yum list gcc-c++

yum install gcc-c++.i686

自动安装即可。

另外开发过程中,需要调试,故Linux机器也需要安装gdb调试工具。

Gdb安装方式类似:

yum install gdb

参考:​​​​​​(2条消息) Linux 下C++开发入门指南,简易入门版_luoduoduojiayou的专栏-CSDN博客_linux开发c++

  •  开始程序编码

利用vi新建3个文件。

vi***

i

输入

:wq

文件名和内容如下

1. print.h

#include<stdio.h>

void printHello();

2. print.c

#include"print.h"

void printHello(){
  printf("Hello, world\n");

 }

3. main.c

#include "print.h"

int main(void){
 printHello();

 return 0;

}
————————————————

  • 编译并且链接

make 把源码编译为可执行程序

 先cd到文件所在目录,ls查看文件情况 

编译---链接过程

   要理解C文件与头文件有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 
1.预处理阶段 
2.词法与语法分析阶段 
3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 
4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,编译器在编译时是以C文件为单位进行的,也就是说如果你的项目中一个C文件都没有,那么你的项目将无法编译,连接器是以目标文件为单位,它将一个或多个目标文件进行函数与变量的重定位,生成最终的可执行文件。

c文件中的#include宏处理,会在预处理的阶段将c中引用的h文件的内容全部写到c文件中,最后生成.i中间文件,这时h 文件中的内容就相当于被写道c文件中。这也为代码的复用提供了渠道,很多的c文件可以去引用同一个h文件,这样这个h文件就会被放到多个c文件中被编译多 次,这也是h文件中不能放定义只能放声明的原因,放定义时被编译多次,在程序链接的时候(系统中定义了多个int a;强符号定义)会出现错误, 声明就不一样,声明表示对定义的扩展,最终都会终结到一个定义上,所以不会出现link时重复定义的错误

通过刚才的手动编译和链接,已经形成一个可执行程序。hello,注意这里没有exe扩展品,实际上你可以根据自己的需要,定义任意的扩展名。

  • 编写makefile文件进行编译

目标:最终想要得到的
依赖:通过什么文件去生成
规则命令:怎么去生成

makefile写法如下:

目标:依赖
tab键 规则命名

 我把文件目录结构进行了调整。在src下编写了makefile文件

 文件内容还是原来的。

因为在makefile中已经定义了编译的规则和依赖的顺序。

只需要在makefile同级别的文件夹下运行make,就看也i完成编译。

 特别提醒,makefile文件不是从上到下执行的,个人感觉是递归的。

具体执行顺序参考:

(2条消息) Makefile中语句的顺序_观赏的博客-CSDN博客_makefile执行顺序

 显示一下文件的内容。

因为这只是一个例子,希望大家认真的打字,不要去粘贴复制。我贴的都是图片。

  •  makefile文件的改进

参考:

(2条消息) Linux 如何编写makefile详解_流云落尘-CSDN博客_linux下makefile编写

[lzy@localhost src]$ cat makefile 
# SrcFiles 定义资源文件
# get all *.c files
SrcFiles=$(wildcard *.c)
# ObjFiles 定义目标文件
# all *.c files --> *.o files	
ObjFiles=$(patsubst %.c,%.o,$(SrcFiles)) # %是通配符
# 变量用法 $(var)
app:$(ObjFiles)
	gcc -o app -I ../include $(ObjFiles)

# app查找的时候依赖某个*.o,转换的时候发现没有,
# 所以去找对应的生成规则,但只有%.o:%c,%是通配符,
# 所以app将依赖的main.o、add.o和sub.o分别进行匹配,
# 而main.o、add.o和sub.o的依赖分别匹配成main.c、add.c和sub.c
%.o:%.c
	# 模式匹配规则,%@、$<等变量,只能在规则中出现,
	# 我这边一个*.o依赖一个*.c,所以$<
	gcc -c $< -I ../include 	

# 这是一个目标测试,依赖和规则可以不写,唯独不能没有目标
# 因为makefile隐含规则,故测试需要指定目标:make test
test:
	echo $(SrcFiles)
	echo $(ObjFiles)
[lzy@localhost src]$ make
gcc -c main.c -I ../include 	
gcc -c add.c -I ../include 	
gcc -c sub.c -I ../include 	
gcc -o app -I ../include main.o add.o sub.o 
[lzy@localhost src]$ ./app 
Sum = 9
Sub = 3
[lzy@localhost src]$ make test
echo main.c add.c sub.c
main.c add.c sub.c
echo main.o add.o sub.o 
main.o add.o sub.o

参考上面代码我写了自己的第二个makefile_2.

可以在make命令中使用参数 -f选择不同的makefile文件。

 增加makefile文件的清理功能

在编译的时候会出现中间的.o文件。我要根据参考文章增加了清理。

 原作者给出了关于伪目标的解释

[lzy@localhost src]$ cat makefile 
....省略
#定义伪目标,防止有歧义
#指定clean是一个伪目标,不是想要得到的目标,只是makefile里面有的
.PHONY:clean

clean:
	# 前面加-号,当该条指令报错的时候,仍继续执行
	-@rm -f *.o
	-@rm -f app
[lzy@localhost src]$ make clean 
[lzy@localhost src]$ 

 调试程序

参考以下文件

(2条消息) linux gdb的详细用法 运行与断点(一)_Z_Dream_ST的博客-CSDN博客_gdb 运行到断点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值