Linux学习第一天

GCC是GNU的编程语言编译器,支持多种语言。源码编译过程包括预处理、编译、汇编和链接。GCC命令如-E仅预处理,-S编译到汇编,-c编译不链接。-o指定输出,-I指明头文件路径,-D定义宏。GCC和G++在处理C/C++代码时有所不同,但都能处理两种语言。文章还介绍了静态库的制作和使用,包括.ar文件的创建和在程序中的链接方法。
摘要由CSDN通过智能技术生成
  1. gcc的学习

gcc是由GNU开发的编程语言编译器,GNU的套件包括C、C++、Objective-C、Java、Ada和Go语言前端,也包含了这些语言的库(如libstdc++,libgcj等)

源码要经历预处理、编译、汇编和链接这四步才能生成可执行文件

代码:

gcc test.c -o app//生成app可执行文件
./app //在当前目录下执行app文件

gcc编译选项:

-E 预处理指定的源文件,不进行编译

-S 编译指定源文件,不进行汇编

-c 编译和汇编指定的源文件,不进行链接

-o 将文件编译成可执行文件

-I 指定include文件的搜索目录

-D 在程序编译时,指定一个宏

#include<stdio.h>
int main(){
#ifdef Debug
    cout<<"111111"<<endl;
#endif
    cout<<"hello";
return 0;
}

这时如果在编译时使用了

gcc test.c -o app -D Debug

则在输出hello的同时输出111111

  1. gcc和g++的区别:

误区1gcc只能编译c代码,g++只能编译cpp代码。事实上两者都可以

后缀为c:gcc认为是c,g++认为是cpp

后缀为cpp:都认为是cpp

在编译阶段,g++会调用gcc,因此在编译c时两者是一致的,但是对于cpp文件,gcc不能自动的和c++程序使用的库链接,通常用g++进行链接

误区2:gcc不会定义 __cplusplus宏,而g++会

事实上,这个宏只是标志着编译器将会把代码按照c还是cpp解释,如果.c文件使用gcc,则宏未定义,如果使用g++则宏定义

误区3:编译只能用gcc,链接只能用g++

严格来说,编译可以用gcc/g++,链接用g++/gcc -lstdc++,见误区1

  1. 静态库的制作

库文件可以看做代码仓库,提供给使用者一些可以直接拿来用的变量、函数和类

库不能单独运行

静态库在程序的链接阶段被复制到了程序中;动态库在程序运行时由系统动态加载

库的好处:代码保密、方便部署分发

命名规则

//linuxz中
libxxx.a
//windows中
libxxx.lib

静态库的制作:

step1:gcc获得.o文件

gcc -c add.c sub.c mult.c div.c 

step2:使用ar工具将.o文件打包

ar rcs libxxx.a add.o sub.o mult.o div.o
//r:不存在就创建、存在就替换
//c:创建存档
//s:创建索引

创建时head头文件不需要打成.o文件,因为编译时会复制包含

但是必须要把库和head一起给用户,不然用户找不到head中的声明

  1. 静态库的使用

先需要把生成的静态库和head文件部署到对应文件夹

cp -r ../calc/libcalc.lib ./lib/
//把上级目录下calc目录中的libcalc.lib库复制到本层目录的lib目录下
./代表当前目录
../代表上层目录
/代表根目录
-r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。

然后使用库

gcc main.c -o app -I ./include/ -l calc -L ./lib/
//-I指定main.c中#include 的查找范围,头文件可能和main.c不在一起
//-l 在程序编译时指定所用的库
//-L 指定库的路径,也可能和main.c不在一级目录下

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值