GCC,G++,静态库,动态库

本文介绍了GCC和G++编译器,详细讲解了编译过程、重要编译参数,并重点探讨了静态库和动态库的生成、使用及其优缺点。静态库通过ar工具打包目标文件生成,动态库则使用gcc添加-fPIC和-shared参数。在动态库的使用中,遇到无法加载问题时,可通过修改LD_LIBRARY_PATH、更新ld.so.cache或拷贝到系统库目录来解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GCC编译器

  1. 不管gcc还是g++都可以编译C程序,编译程序的规则和参数相同;
  2. g++可以直接编译C++程序,gcc编译C++程序需要添加额外参数-lstdc++
  3. 不管是gcc还是g++都可以定义__cplusplus

实际使用中:

# 使用gcc指令编译C代码
#只用g++指令编译C++代码
#例如:
g++ test.cpp -o test

编译过程

  1. 预处理-Pre-Processing //.i文件
# -E 选项指示编译器仅对输入文件进行预处理
g++ -E test.cpp -o test.i      //i文件
  1. 编译-Compilling //.s文件
# -s 编译选项告诉g++在为c++代码产生了汇编语言文件后停止编译
# g++产生的汇编语言文件的缺省扩展名是 .s
g++ -c test.s -o test.o
  1. 汇编-Assembling //.o文件
# -c选项告诉 g++ 仅把代码编译为机器语言的目标代码
# 缺省时 g++ 建立的目标代码文件有一个 .o 的扩展名。
g++ -c test.s -o test.o

4.链接-Linking

# -o 编译选项来为产生的可执行文件用指定的文件名
g++ test.o -o test

g++重要编译参数

  1. -g 编译带调试信息的可执行文件
# -g 在编译的时候生成调试信息,该程序可以被调试器调试,即编译带调试信息的可执行文件
# 产生带调试信息的可执行文件test
g++ -g test.cpp -o test
  1. -O[n] 优化源代码
# 所谓优化,例如省略代码中从未使用的变量、直接将常量表达式用结果值代替等等,这些操作会缩减目标文件所包含的代码量,提高最终生成的可执行文件的运行效率。

# -O选项告诉g++对源代码进行基本优化,这些优化在多数情况下都会使程序执行的更快。-O2选项告诉g++产生尽可能小和尽可能快的代码,如-O2, -O3, -On(n常为0-3)

#最常用的是-O2
g++  -O2 test.cpp
#或
g++ test.cpp -O2 -o test
  1. -L和-l(小写L) 指定库文件 | 指定库文件路径
# -l参数(小写)就是指定程序要连接的库,-l参数紧接着就是库名
# 在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接

# 链接glog库
g++ -lglog test.cpp

# 如果库文件没有放在上面三个目录中,需要使用-L参数(大写)指定库文件所在目录
# -L参数跟着的是库文件所在目录里

# 连接mytest库,libmytest.so 在/home/bing/mytestlibfolder目录下
g++ -L/home/bing/mytestlibfolder -lmytest test.cpp
  1. -I(directory,大写i)
# -I 指定include 包含文件的搜索目录
# /usr/include目录一般是不用指定的,gcc知道去哪里找,但是如果头文件不在/usr/include里面,我们就需要用-I参数指定了,比如头文件放在/myinclude目录中,那么编译命令行就要加上-I/myinclude 参数了,如果不加,将返回一个“xxx.h: No such file or directory”的错误。-I参数可以用相对路径,比如头文件在当前目录,可以用-I来指定。上面提到的-cflags参数就是用来生成-I参数的。
g++ -I/myinclude test.cpp
  1. -Wall打印警告信息
# 打印出gcc提供的警告信息
g++ -Wall test.cpp
  1. -w 关闭警告信息
# 关闭警告信息
g++ -w 
  1. -std=c++11 设置编译标准
#使用-std=c++11 设置编译test.cpp
g++ -std=c++11 test
</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值