Linux编程C/C++

一、编译的四个阶段


源文件:编写的文件代码.c /.cpp
预处理:编译处理宏定义等宏命令(eg:#define)——生成后缀为“.i”的文件   
编译:将预处理后的文件转换成汇编语言——生成后缀为“.s”的文件   
汇编:由汇编生成的文件翻译为二进制目标文件——生成后缀为“.o”的文件   
链接:多个目标文件(二进制)结合库函数等综合成的能直接独立执行的执行文件——生成后缀为“.out/.exe”的文件

命令:unix>gcc –E hello.c -o hello.i 
作用:将hello.c预处理输出hello.i

命令:gcc -S hello.i -o hello.s 
作用:将预处理输出文件hello.i汇编成hello.s文件

命令:gcc -c hello.s -o hello.o 
汇编器as 将hello.s 翻译成机器语言保存在hello.o 中(二进制文本形式)。

命令:gcc  hello.o -o hello
链接阶段,变为可执行程序

在我们理解了上述四个流程后,我们在关注gcc和g++在流程上的区别。
gcc无法进行库文件的连接,即无法编译完成步骤4;而g++则能完整编译出可执行文件。(实质上,g++从步骤1-步骤3均是调用gcc完成,步骤4连接则由自己完成)

二、gcc 与g++的区别


首先说明:gcc 和 GCC 是两个不同的东西
GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。
gcc是GCC中的GUN C Compiler(C 编译器)
g++是GCC中的GUN C++ Compiler(C++编译器)

三、创建静态库

Windows平台静态库是lib文件,UNIX平台动态库是a文件

main.cpp

#include <iostream>
// #include "add.cpp"
using namespace std;
int main(int argc, char* argv[])
{
    int add(int a, int b);
    int c = add(1, 2);
    cout << c << endl;
    return 0;
}

add.cpp

#include "iostream"
int add(int a, int b)
{
    return a + b;
}

1.将代码编译为二进制文件.o

g++ -c add.cpp

2. 将.o文件编译为静态库文件.a

 ar -cr liboperation.a add.o

3.将静态库文件与主程序进行链接

g++ main.cpp liboperation.a -o exec

g++ main.cpp liboperation.a  不加-o自动生成可执行程序名称

gcc main.c -o all_a -loperation

四、创建动态库

Windows平台动态库是dll文件,UNIX平台动态库是so文件

UNIX编译

1.编译二进制文件.o

g++ -c -fpic add.cpp

2.将.o文件变为动态库.so文件

g++ -shared add.o -o liboperation.so

3.将动态库与主程序链接

(-l 后面写参数时会自动去掉动态库的lib前缀和.so后缀)

g++ main.cpp -o exec -loperation -LD://C++//project//03

gcc main.c -o all_so -loperation

Windows平台编译

1.编译二进制文件.o

g++ -c -fpic add.cpp

2.将.o文件变为动态库.dll文件

g++ -shared add.o -o liboperation.dll

3.将动态库与主程序链接

g++ main.cpp -o exec -loperation -LD://C++//project//03

g++ main.cpp -LD://C++//project//03 -loperation

Makefile使用

Makefile文本

debug:
	@echo "hello"
clean:
	@rm -rf D:\C++\project\03\a.exe
.PHONY: clean debug

 D:\C++\qt5.12.7\Tools\mingw730_64\bin\mingw32-make.exe debug

输出值,在变量前面加了@不输出命令只输出结果

Make变量

cpp := main.cpp
obj := main.o

$(obj):$(cpp)
	@g++ -c $(cpp) -o $(obj)

compile:$(obj)
debug:
	@echo $(cpp)
	@echo $(obj)

D:\C++\qt5.12.7\Tools\mingw730_64\bin\mingw32-make.exe compile 执行命令将main.cpp生成main.o

cpp := main.cpp
obj := main.o

$(obj):$(cpp)
	@g++ -c $< -o $@

compile:$(obj)

clean:
	@rm -rf $(obj)
.PHONY: clean
debug:
	@echo $(cpp)
	@echo $(obj)

Make常用的运算符

 =会改变后续的值 :=不会改变后续的值

HOST_ARCH = aarch64
TARGET_ARCH = $(HOST_ARCH)

HOST_ARCH = amd64

debug:
	@echo $(TARGET_ARCH)

Make file 

HOST_ARCH = aarch64

HOST_ARCH ?= amd64

debug:
	@echo $(TARGET_ARCH)

 +=相等于后续添加内容

Make file常用的函数

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值