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

[minilibc] 库文件的调用放置

minilibc: 一个用于学习目的的 C 标准库的简化实现 (claude-3.7-sonnet Cursor IDE),展示了 C 库的核心组件,包括程序的启动和结束、基本的内存管理、字符串操作以及简化的 I/O 功能。

该库实现了 _start 函数以设置环境,并提供了简单的 malloc, free, strlenstrcpy。构建该库只需运行 make 命令,生成静态库和测试程序。

用AI然后打脸...修了好多 bug

例如

  • Inline assembly 忘记 %%

  • _start 的 rsp 已经被改过了
  • mmap 的参数顺序错了
  • munmap 忘记处理头上的 8 字节 size

    • 也只是让 test.c 能正常运行了
    • 不知道还有没有更多的问题

代码:谨慎使用 AIGC


运行

注意

我们可以发现,cursor 将要调用的外部库的头文件放到项目的 include 目录下,主要是为了解决 代码组织、编译依赖、路径管理 三个核心问题。以下是具体原因和实现逻辑:


一、核心原因

  • 统一管理头文件路径
    • 编译器默认会从系统路径(如 /usr/include)和项目 include 目录查找头文件。
    • 将外部库头文件集中到 include 下,可避免手动写冗长的路径(如 #include "../../libs/foo.h")。
  • 隔离系统依赖
    • 系统全局安装的库可能版本不匹配(如系统 OpenSSL 是 1.1,项目需要 3.0)。
    • 项目内 include 可存放特定版本的库头文件,确保编译时使用正确版本。
  • 便于版本控制
    • 若库文件与项目代码一起提交到 Git,放在 include 下能明确管理依赖关系。
    • 示例:
project/
├── include/
│   └── mylib/      # 第三方库头文件
│       ├── utils.h
│       └── config.h
└── src/└── main.c     # 使用 #include <mylib/utils.h>

二、实现方式对比

方式

适用场景

优缺点

系统路径安装

全局通用库(如 libc、OpenSSL)

✅ 无需修改项目结构
❌ 版本冲突风险高

项目内 include

私有库或需定制版本的库

✅ 版本可控
❌ 增加项目体积

构建工具管理

CMake/FetchContent/vcpkg

✅ 自动下载依赖
❌ 需配置构建系统


三、实际编译流程示例(以 GCC 为例)

  1. 未使用 include 目录(路径混乱):
gcc -I../libs/mylib -I../../deps/include -o main src/main.c
  1. 使用 include 目录(路径清晰):
gcc -Iinclude -o main src/main.c
    • 编译器自动在 include 下查找所有头文件。

四、何时需要放入 include?

  1. 需要修改库代码:调试或定制第三方库时,直接修改 include 下的文件。
  2. 跨平台兼容:将不同平台的头文件统一放在 include 的子目录中(如 include/linux/, include/windows/)。
  3. 避免命名冲突:通过子目录隔离同名头文件(如 include/lib1/foo.hinclude/lib2/foo.h)。

五、替代方案建议

如果不想污染项目结构,可通过以下方式替代:

  1. 符号链接
ln -s /path/to/external_lib/include project/include/external_lib
  1. CMake 的 target_include_directories
target_include_directories(myapp PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../external_lib/include)
http://www.xdnf.cn/news/2849.html

相关文章:

  • 案例篇:如何用tcpdump和Wireshark识别潜在威胁
  • 大学之大:韩国科学技术研究院2025.4.28
  • Python依据卫星TLE轨道根数,计算可见时间窗口
  • Web 基础与Nginx访问统计
  • SECS-I vs HSMS-SS vs HSMS-GS 通信控制对比明细表
  • TypeScript 实用类型深度解析:Partial、Pick、Record 的妙用
  • SQL常用数据清洗语句
  • Python爬虫学习路径与实战指南 02
  • 苍穹外卖10
  • React学习
  • Spring系列四:AOP切面编程第四部分
  • 计网分层体系结构(包括OSI,IP,两者对比和相关概念)
  • 免费LUT网站
  • 花费7元训练自己的GPT 2模型
  • 4月28日信息差全景:国际局势、科技突破与市场震荡一、国际政治与安全:俄乌冲突关键转折
  • 利用Python生成Xilinx FPGA ROM IP核 .coe初始化文件
  • Python面试问题
  • 贪心算法-2208.将数组和减半的最小操作数-力扣(LeetCode)
  • 遥控器的智能跟踪与多路径优化模块要点!
  • 【网络编程】TCP/IP四层模型、MAC和IP
  • MySQL 的ANALYZE与 OPTIMIZE命令
  • 使用 ELK 实现全链路追踪:从零到一的实践指南
  • pycharm 配置路径映射 将本地文件映射(mapping)到远程服务器上
  • [Spring] Seata详解
  • Missashe考研日记-day29
  • 6.进程概念(中)
  • 智能指针之设计模式6
  • 项目立项管理
  • Android Studio 安装 Continue插件
  • 数据库中的主键(Primary Key)