g++的使用
g++
- GCC(GNU Compiler Collection)
- gcc(GNU C Compiler)
- g++(GNU C++ Compiler)
源文件生成可执行文件的过程
- 预处理(Preprocess)
- 编译(Compile)
- 汇编(Assemble)
- 链接(Link)
文件 | 过程 | 输出 | 命令 | 工具 |
.h、.c、.cpp → | ↓ | |||
Preprocess | g++ -E source.cpp -o target.ii | cpp | ||
↓ | → .ii | |||
Compile |
|
g++ -S source.cpp |
cc | |
↓ | → .s | |||
Assemble | g++ -c source.cpp | as | ||
↓ | → .o | |||
.a、.so → | Link | ld | ||
↓ | → 无扩展名 |
静态链接库与动态链接库的区别
- 静态链接库:在链接阶段,和目标文件(.o)一起链接到可执行文件中,由于可执行文件中已经包含静态链接库内容,因此在可执行文件执行时无需静态链接库文件
- 动态链接库:在整个编译阶段,并不链接到可执行文件中,而是在可执行文件执行时才被链接,由于可执行文件中不包含静态链接库内容,因此在可执行文件执行时仍需要动态链接库文件
单个C++源文件(.cpp文件)生成可执行文件
包含main函数的可独立运行的单个C++源文件,通过如下方式生成可执行文件:
g++ -o filename2 filename1.cpp
filename1.cpp:源文件
filename2:生成的可执行文件名称
-o:用于指定生成的可执行文件名称(若无此参数则生成文件默认名称为a)
多个C++源文件(.cpp文件)生成可执行文件
多个C++源文件,main函数在其中之一且各文件运行存在依赖关系,通过如下方式生成可执行文件:
g++ -o filename3 filename1.cpp filename2.cpp
filename1.cpp、filename2.cpp:源文件(在命令行中以任意顺序排列均可)
filename3:生成的可执行文件名称
需要注意的是,参与生成可执行文件的源文件中必须有且仅有一个包含main函数
多个C++源文件(.cpp文件)生成目标文件(.o)
多个C++源文件,通过如下方式生成目标文件:
g++ -c filename1.cpp filename2.cpp
命令行中的每个源文件都将会生成与之同名的一个目标文件
多个C++源文件(.cpp文件)生成静态链接库(.a)
多个C++源文件,通过如下方式生成静态链接库:
- 首先生成各源文件的目标文件(.o文件)
g++ -c filename1.cpp filename2.cpp
- 然后将多个目标文件生成静态链接库
ar -r libfilename3.a filename1.o filename2.o
filename1.cpp、filename2.cpp:源文件
filename1.o、filename2.o:目标文件
libfilename3.a:生成的静态链接库(静态链接库需要以lib开头来命名且扩展名为.a)
注意,用于生成静态链接库的文件为目标文件而非源文件,注意与动态链接库的生成相区别
编译中使用静态链接库(.a)
编译中使用静态链接库,通过如下方式生成可执行文件:
g++ -o filename2 filename1.cpp -Lpathname -lfilename3
filename1:源文件
filename2:编译生成的可执行文件名称
-lfilename3:静态链接库名称(需去掉静态链接库名称前的lib并加上-l且无.a扩展名,注意与上面的libfilename3.a相区别)
-Lpathname:编译时链接的静态链接库所在路径(若静态链接库与源文件处于相同目录则路径则pathname可写为“.”)
注意,源文件filename1.cpp需要放在静态链接库filename3之前,否则报错
多个C++源文件(.cpp文件)生成动态链接库(.so)
多个C++源文件,通过如下方式生成动态链接库:
g++ -o libfilename3.so filename1.cpp filename2.cpp -fPIC -shared
filename1.cpp、filename2.cpp:源文件
libfilename3.so:生成的动态链接库(动态链接库需要以lib开头来命名且扩展名为.so)
-fPIC:表示编译为位置独立的代码以实现代码段共享的目的
-shared:表示生成动态链接库
注意,用于生成动态链接库的文件为源文件而非目标文件,注意与静态链接库的生成相区别
编译中使用动态链接库(.so)
编译中使用动态链接库,通过如下方式生成可执行文件:
g++ -o filename2 filename1.cpp -Lpathname1 -lfilename3 -Wl,--rpath=pathname2
filename1.cpp:待编译且运行过程中链接动态链接库的源文件
filename2:编译生成的可执行文件名称
-lfilename3:动态链接库名称(需去掉动态链接库名称前的lib并加上-l且无.so扩展名,注意与上面的libfilename3.so相区别)
-Lpathname1:编译时链接的动态链接库所在路径(若动态链接库与源文件处于相同目录则路径pathname可写为“.”)
-Wl,--rpath=pathname2:可执行文件运行时动态链接库所在路径(注意与编译时链接的动态链接库所在路径的区别,-L指出的路径要求编译时动态链接库在此路径下,而此处指出的路径为编译完成的可执行文件在运行时链接动态链接库的路径)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)