当前位置: 首页 > news >正文

makefile 学习(3):C++的编译及库文件的生成与链接

1. 介绍

C++语言的相关后缀

  • .a 文件是一个静态库文件
  • .c,.c++ ,.cp,.cpp,.cc,.cxx 这几种后缀都可以表示c++的源文件
  • .h ,.hpp c++语言的头文件
  • .i 是c++预处理文件
  • .o 目标文件
  • .s汇编语言的文件
  • .so 动态库或者共享库或者称为运行时库

2. C++编译

2.1 预处理

g++ -E helloworld.cpp   # 虽然预处理了,但不会输出.i文件
g++ -E helloworld.cpp -o helloworld.i   # 指定输出.i文件
  • -E选项告诉编译器只进行预处理操作
  • -o 选项把预处理的结果输出到指定文件

2.2 生成汇编语言

g++ -S helloworld.cpp
g++ -S helloworld.cpp -o helloworld.s
  • -S 选项告诉编译器,进行预处理和编译成汇编语言操作

每个平台对应的汇编语言的形式是不同的,例如有很多型号的开发板,有很多型号的CPU

2.3 源文件生成目标文件

g++ -c helloworld.cpp   # 默认生成 helloworld.o 目标文件
g++ -c helloworld.cpp  -o harumph.o  # 指定目标文件名
#编译多个.c文件
g++ -c helloworld.cpp helloworld1.cpp hellworld2.cpp

2.4 生成可执行文件

(1) 单个源文件编译为可执行文件

  • 注意: 后面2个命令执行后并没有按编译过程出现.i,.s,.o文件,并不意味着没有经历这些过程
g++ helloworld.cpp
g++ helloworld.cpp -o howdy

执行程序

./可执行文件

(2) 多个源文件编译为可执行文件

g++ hellomain.cpp  sayhelo.cpp -o hello

3. 生成库文件

3.1 生成静态库

(1) 编译成.o文件

g++ -c [.cpp] -o [自定义文件名]  #单个源文件
g++ -c [.cpp] [.cpp] ...   # 多个源文件

(2) 编译静态库

ar -r [lib自定义库名.a]  [.o] [.o] ...

(3) 链接成可执行文件

g++ [.cpp] [.a] -o [自定义输出文件名]
g++ [.cpp] -o [自定义输出文件名] -l[库名] -L[库所在路径]

3.2 生成动态库

(1) 编译二进制.o文件

g++ -c -fpic [.c/.cpp] [.c/.cpp] ...

(2) 编译动态库

g++ -shared [.o] [.o] ... -o [lib自定义库名.so]

(3) 链接动态库到可执行文件

g++ [.c/.cpp] -o [自定义可执行文件名] -l[库名] -L[库路径] -Wl,-rpath=[库路径]

4. 总结

(1). 编译过程

源文件.cpp文件 -> 预编译成.i文件 -> 编译成汇编语言.s -> 汇编成.o文件 -> 链接成可执行文件(名字自定义,后缀没关系)

(2). 编译过程命令

  • 预处理
g++ -E [.cpp源文件] -o [自定义输出文件名.i]
  • 编译成汇编语言[隐藏了预处理操作]
g++ -S [.cpp源文件]
  • 编译目标文件(二进制文件,可用于链接)
g++ -c [.cpp源文件] [.cpp源文件] [...] (可选项:-o [自定义文件名])

(3). 库

静态库

  • 编译(先转成.o文件,在编成lib(自定义库名).a)
g++ -c [.cpp源文件] [.cpp源文件] [...] (可选项:-o [自定义文件名])  #编译目标文件
ar -r lib[自定义库名].a  [.o文件] [.o文件]  [...]

动态库

  • 编库
    • 第一种做法,先转成.o文件,再编成.so文件
    g++ -c fpic [.cpp源文件]  [.cpp源文件]  [...]     
    g++ -shared [.o文件]  [.o文件] [...] -o lib[库名].so```
    
  • 第二种做法,直接转成.so
g++ -fpic -shared  [.cpp源文件]  [.cpp源文件]   [...]  -o  lib[库名].so
  • 链接
g++ [main文件] -o [自定义输出可执行文件名] -l[库名] -L[库所在路径] -Wl, -rpath=[库所在路径]

可以看出C++的编译和库连接与C的编译和链接,基本上都是一模一样。区别很简单:

  • 命令中 c++用的是g++编译器, c语言用的是 gcc编译器
  • 并且g++编译器同时也支持.c c文件的编译
http://www.lryc.cn/news/69331.html

相关文章:

  • Ceph crush运行图
  • 【分布族谱】泊松分布和二项分布、正态分布的关系
  • 关于QTreeWidget的setData函数
  • Microsoft Office 2003的安装
  • 使用Spring Boot和Spring Cloud实现多租户架构:支持应用多租户部署和管理
  • 智聚北京!相约全球人力资源数智化峰会
  • 工业缺陷检测数据及代码(附代码)
  • CentOS 安装MongoDB 6.0
  • 美团面试,被拷打了一小时....
  • 017+C语言中函数栈帧的创建与销毁(VS2022环境)
  • 马斯克们叫停 GPT-5,更像是场行为艺术
  • 事务基础知识
  • 国产高性能DSP音频处理芯片的工作原理以及应用领域
  • BEVDet4D 论文学习
  • 【设计模式与范式:创建型】43 | 单例模式(下):如何设计实现一个集群环境下的分布式单例模式?
  • Metal入门学习:绘制渲染三角形
  • python 中常见变量类型
  • SVN使用教程(一)
  • 【5.19】四、性能测试—指标、种类
  • Windows平台上的5种敏捷软件开发(过程)模型
  • 一文实现部署AutoGPT
  • 数值计算 - 误差的来源
  • 【软件测试】5年测试老鸟总结,自动化测试成功实施,你应该知道的...
  • 【Hadoop】二、Hadoop MapReduce与Hadoop YARN
  • Python教程:文件I/O的用法
  • 序员工作1年,每天上班清闲,但却焦虑万分,若是你,你会吗?
  • Bed Bath and Beyond EDI 需求分析
  • 【5.20】五、安全测试——渗透测试
  • java版鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统源代码
  • 大语言模型架构设计