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

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
</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
静态的"undefined reference to"错误通常是由于链接器无法找到所需的函数或符号的实现引起的。根据引用\[1\]和引用\[3\]的内容,这种错误可能有以下几个原因: 1. 检查.pro文件中是否正确引用了需要调用的,并且确保文件存在于正确的位置。 2. 检查头文件是否使用了extern "C"修饰,以确保C++代码正确调用C中的函数。 3. 确保QT中的编译器位数与编译C时使用的编译器位数一致,这是一个容易被忽视的问题。 根据引用\[2\]的内容,还有可能是由于编译目标文件扩展名的更改导致的问题。如果你将C++项目的.cpp文件更改为.c文件,但没有将编译器从g++改为gcc,那么生成的目标文件可能仍然包含C++风格的函数名,而与C中的函数名不一致,从而导致"undefined reference to"错误。 综上所述,解决这个问题的方法包括检查.pro文件中的引用、修饰头文件、确保编译器位数一致以及正确更改文件扩展名和编译器类型。 #### 引用[.reference_title] - *1* [QT调用C动态/静态出现undefined reference to xxx和xxx@4](https://blog.csdn.net/AFunnyBoy/article/details/124480245)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [linux 链接 静态 undefined reference to](https://blog.csdn.net/doubleface999/article/details/55798714)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值