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

Linux学习笔记|GCC编译指令基础|静动态库|makefile

一、GCC 编译指令基础

  1. 基本编译命令
    • gcc -o code code.cgcc code.c -o code:这两条命令功能相同,都是使用 GCC 编译器将code.c源文件编译成名为code的可执行文件。-o选项用于指定输出文件名,选项位置在源文件前后不影响最终结果。
  2. 编译过程分步指令
    • 预处理gcc -E code.c -o code.i,该指令对code.c进行预处理,生成code.i文件,预处理主要处理源文件中的宏定义、头文件包含等。
    • 编译gcc -S code.i -o code.s,将预处理后的code.i文件编译成汇编语言文件code.s,此过程将高级语言转换为汇编语言。
    • 汇编gcc -c code.s -o code.o,把汇编语言文件code.s汇编成目标文件code.o,目标文件是机器语言代码,但还未进行链接。
    • 链接gcc code.o -o code,将目标文件code.o与必要的库文件链接起来,生成最终可执行文件code 。
  3. 编译选项及问题
    • -c选项gcc -c code.c可生成目标文件code.o,但此时code.o不能直接执行,因为还缺少链接步骤,未解决外部符号引用等问题。
    • 权限问题:编译生成的可执行文件可能存在权限问题,如提示not a dynamic executableyou do not have execute permission for './code.o' ,需要通过chmod命令赋予执行权限,如chmod +x code 。
    • 链接库问题:如果程序依赖某些库,编译时可能需要指定库路径和库名。例如,链接动态库时,若提示找不到库文件,可通过-L选项指定库路径,-l选项指定库名(如gcc code.c -L/path/to/lib -lmylib -o code )。

二、静态链接与动态链接

  1. 库的分类与命名
    • 静态库:在 Windows 下通常以.lib为后缀,在 Linux 下以.a为后缀,命名一般为libXXX.a 。
    • 动态库:Windows 下后缀为.dll ,Linux 下后缀为.so ,命名形式如libXXX.so 。
  2. 链接方式及特点
    • 静态链接:使用-static选项,如gcc code.c -o myexe_static -static 。优点是可执行文件独立,不依赖外部库就能运行;缺点是文件体积大,若多个程序使用相同库,会在内存中存在多份库代码副本。
    • 动态链接:默认链接方式,如gcc code.c -o myexe 。优点是可执行文件体积小,多个程序可共享库的内存副本;缺点是运行时依赖库文件存在且版本正确,否则会出现找不到库或库版本不兼容问题 。

 

三、Makefile 基础

  1. 基本概念
    • make是 Linux 系统内置命令,Makefile是用户编写的文本文件,用于自动化构建和维护项目。
  2. 编写规则
    • 目标、依赖关系和命令:一个简单的Makefile示例:
      myexe: code.cgcc -o myexe code.c

                                        依赖关系+依赖方法 =等于我们要编译程序的目的 

这里myexe是目标,code.c是依赖文件,gcc -o myexe code.c是构建目标的命令。

  • 自动推导Makefile能自动推导一些常见命令,如对于myexe: code.c ,若不写具体命令,make会尝试使用默认规则推导命令(类似于gcc -o myexe code.c )。
  • 清理规则:常添加clean目标用于清理生成的文件,如:
clean:rm -f myexe code.o

 使用make clean可执行清理操作。
3. 最佳实践

  • 文件时间戳判断make根据文件的修改时间戳判断是否需要重新构建目标。如果目标文件不存在,或目标文件的时间戳比其依赖文件旧,make会执行相应命令重新构建。
  • 多目标和复杂依赖处理:对于大型项目,Makefile可处理多个目标以及复杂的依赖关系,通过合理组织规则,提高项目构建效率。

 

http://www.xdnf.cn/news/7161.html

相关文章:

  • KAG:通过知识增强生成提升专业领域的大型语言模型(五)
  • Python异常处理与OOP深度解析及实战案例
  • 软件调试纵横谈-18-页堆
  • Java程序员学AI(一)
  • [强化学习的数学原理—赵世钰老师]学习笔记02-贝尔曼方程-下
  • Python 从列表中删除值的多种实用方法详解
  • C++学习:六个月从基础到就业——C++17:std::optional/variant/any
  • 玄机-第一章 应急响应-Linux日志分析
  • LoRA微调的参数学习
  • 1-机器学习的基本概念
  • 浅入ES5、ES6(ES2015)、ES2023(ES14)版本对比,及使用建议---ES6就够用(个人觉得)
  • 电子电路:什么是电子电路中的噪声?为什么会产生噪声?噪声全部是负面影响吗?
  • React-Query使用react-testing-library进行测试
  • c/c++的opencv直方图初识
  • HarmonyOS:应用文件访问(ArkTS)
  • C++算法(23):memset原理、性能对比与替代策略
  • 数据共享的艺术
  • C++中的容器
  • 进程和线程的区别和联系
  • FreeRTOS的学习记录(中断管理)
  • 5.18打卡
  • 延时双删-争议与我的思路-001
  • 动态通讯录程序
  • P1009 [NOIP 1998 普及组] 阶乘之和
  • 深入理解 LangChain 文档处理机制:Document 类与文档加载器详解
  • uni-app学习笔记七-vue3事件处理
  • 优化 Spring Boot 应用启动性能的实践指南
  • 单片机超频怎么搞?
  • 实时时钟项目设计
  • 腾讯云证书过期提醒的应对措施,Caddy 自动管理的 Let‘s Encrypt 证书.