You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

g++ -c与g++ -shared的区别及适用场景咨询

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:59:54