g++ -c与g++ -shared的区别及适用场景咨询
基础前提:编译的两个阶段
C/C++代码变成可运行程序分两步:编译(把人类写的源码翻译成机器能识别的中间代码)和链接(把零散的中间代码、依赖库拼合成完整的可执行文件/库)。
1. g++ -c 的作用与特性
- 只执行编译步骤,完全不涉及链接。
- 输出是
.o后缀的「目标文件」——可以理解成单独的“零件”,里面只有当前源码对应的机器码,但缺少调用外部函数的地址、标准库依赖等关键信息,没法直接运行。 - 比如你有
a.cpp和b.cpp,用g++ -c a.cpp生成a.o,g++ -c b.cpp生成b.o,这俩都是独立的半成品,还没拼成能用的成品。
2. g++ -shared 的作用与独特特性
- 同时完成编译+链接,但最终输出的是共享库(Linux下为
.so文件,Windows下是.dll),不是可执行程序。 - 核心独特性:
- 共享库是“公共零件库”,可以被多个程序同时复用——比如系统自带的
libc.so(标准C库),所有C程序都能调用它,不用每个程序都把库的代码打包进去。 - 链接时不会把依赖的其他共享库代码直接打包进来,只会记录需要调用的库名称和函数位置,等程序运行时再动态加载这些库。
- 生成的共享库本身不能直接运行,它是给其他程序“借代码”用的。
- 共享库是“公共零件库”,可以被多个程序同时复用——比如系统自带的
适用场景对比
用g++ -c的场景
- 拆分大型项目编译:把一个项目的多个
.cpp文件分别编译成.o,最后再用g++ a.o b.o -o my_program链接成可执行文件。这样修改单个文件时,只需要重新编译对应.o,不用全量编译,节省时间。 - 需要手动控制链接过程:比如要链接特定第三方库、指定链接顺序时,先拿到所有
.o文件再链接会更灵活。
用g++ -shared的场景
- 制作可复用的工具库:比如你写了一套通用的加密函数,想让多个项目直接调用,就把代码编译成共享库,其他项目只需链接这个
.so文件就能用,不用复制你的源码。 - 缩减程序体积:因为共享库是多程序共用的,每个程序不用把库的代码打包进去,只需要记录调用关系,最终生成的可执行文件会更小。
为啥两个命令都能成功编译?
g++ -c只做编译,只要源码语法没问题,就能生成.o文件,自然会成功。g++ -shared是编译+链接成共享库,只要代码没有必须包含main()(共享库不需要主函数)的要求,且语法、依赖都正常,就能生成.so文件。但如果你的代码只有main(),生成的.so也没法直接运行——它不是可执行程序。
内容的提问来源于stack exchange,提问作者jabru
相关产品推荐
相关产品推荐

