初步了解mac下C源码的编译过程


参考:

  1. 请问Mac OS X (10.9.1)下创建和使用动态链接库的方法
  2. cc、gcc、g++、CC的区别概括 - 今晚打酱油_ - 博客园
  3. Linux 下 的 cc 和 gcc - 周银辉 - 博客园
  4. 介绍可执行文件的内部结构(Windows + Linux + Mac)_运维_清风阁-CSDN博客
  5. mac OSX系统的可执行文件格式是什么-ZOL问答
  6. macOS 的头文件隐藏这么深 - 简书
  7. Mac OS X下的动态链接库_运维_cbbbc-CSDN博客

前言:

万物皆源于hello,world!
即万物皆应该从使用的角度上,才能切实被掌握!
所以在这里,还是打算通过两个实际的例子来掌握mac下C源码的编译过程

  1. apue的库编译过程,我希望弄清楚apue最简单的一个原来的编译过程,也就是gcc是怎么通过-l参数来直接获取对应的链接库的,还有gcc是到哪里找的apue.h头文件 (deadline2020-4-4 23:59:59)
  2. mongoose下examples中的http-client的编译过程,我希望首先弄清楚这个的编译过程,然后将源码编译出来,并成功运行(deadline2020-4-5 23:59:59)

人话:

这部分内容是我用来闲聊的,与主题无关,赶时间的完全可以跳过。
今天在拱宸桥附近的星巴克咖啡花了点时间,喝了一杯美式咖啡。感觉天气真的很好,绕着运河岸边自顾自地走着。突然远方走来一对情侣,虽然是情侣,但是并没有挽着手。那个女孩,那眼睛,那发型,那神态,就算隔着厚厚的口罩我也能感觉地出来我曾经认识他。她对着我点了点头,然后两人从我身边走过,我愣在原地,一段往事像纪录片般闪过我的脑间,这是为什么呢?
那年我还是高一,就读于排序第八位的重高,中考的失利让我沉沦了一年。在那年里,有一个女孩对我说,“我是她的偶像”,并时不时和我聊天。真的,那个时候,她的出现就像照入冰封峡谷的一缕阳光。虽然那个时候我的成绩在班里名列前茅,但是因为中考的失利,我无暇顾及成绩外的事情,只希望能进入所谓的实验班。最后我也如愿以偿,进入了实验班,但是也因为如此,高中后面的两年,我基本就没有见到过她了。或许,当时我不那么忙,我后面的生活会快乐和绚烂很多吧。
迟疑片刻,我往后望去,看着渐行渐远的背影。我思索着,如果真的是她,我如今这份面容。当她知道,曾今的那人,如今竟然是这样的尊荣。她的内心是不是会暗暗嘲弄自己一番。所以我选择了远去。
世界上最无聊,最愚蠢的事情就是为自己的过去暗暗惆怅,无法自拔。但是我却常常回忆,我就是犯贱。你要记住,无论你对于过去如何哭天抢地,头破血流也好,横尸当场也罢。过去的已经成为过去,你所能做的永远只有改变未来。
知乎上有一句话常常让我能在迷茫的时候重新拾起自己。
问:“我都30岁了,现在学习编程来来不来得及?”
答:“培育一棵树的最佳时间是十年以前,其次是现在!”
好了,希望我未来遇到相同的事情的时候,能够走上前去,淡然一笑道:“你好,请问我们是不是认识?”


正文:

一. 了解apue库的导入过程

1.确保能正常编译运行myls.c源文件
以下是apue中的遍历输出文件夹中的文件代码:

#include <sys/types.h>
#include <dirent.h>
#include "apue.h"
//程序的目的为实现类似ls的遍历输出文件夹内文件的名称的功能效果
int main(int argc, char *argv[])
{DIR *dp;struct dirent *dirp;if(argc != 2)//如果传入的参数个数不为2,说明传参错误err_quit("a single argument (the directory name) is required");if((dp = opendir(argv[1])) == NULL)err_sys("can't open %s", argv[1]);while((dirp = readdir(dp))!= NULL)printf("%s\n",dirp -> d_name);closedir(dp);exit(0);
}

在同一文件夹下进行编译:
gcc myls.c -o myls -lapue
编译成功,这里我的环境上已经导入了apue.h以及对应的链接库,所以编译不会出错。执行可执行文件,能正确输出当前用户根文件夹下的文件名列表。
./myls ~
至此,至少能证明我有能力编译通源代码。然后关键就是明白gcc是如何找到我指令以及源码中所需要的依赖的。

2.Gcc是如何找到我指令以及源码中所需的依赖的?
我们生活中所遇到的大多数问题都最终能回归人类三大哲学性问题,即小区保安深谙之理:
(1)您是谁
(2)您从哪里来
(3)您要到哪里去

这里需要知道两件事情:
(1)Mac上默认的第三方库(静态链接库,动态链接库)的路径为/usr/local/lib,头文件的路径为/usr/local/include
(2)Mac上xcode有自带的库,路径随版本有略微不同,大体为/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib

Ok,基本这样就可以解答我所说的三大哲学性问题了:
(1)您是谁:我是希望引入的头文件或库文件
(2)您从哪里来:我从系统默认路径来
(3)您要到哪里去:我受gcc调用,参与编译过程

初步了解mac下C源码的编译过程相关推荐

  1. Ubuntu16下bitcoin源码的编译与运行-2021

    Ubuntu16下bitcoin源码的编译与运行 1.更新软件列表 2.安装依赖包 3.将源代码克隆到本地 4.编译运行 5.回到./bitcoin目录下重新编译 6.编写配置文件 7.bitcoin ...

  2. v57.02 鸿蒙内核源码分析(编译过程) | 简单案例说透中间过程 | 百篇博客分析HarmonyOS源码

    子畏于匡,颜渊后.子曰:"吾以女为死矣."曰:"子在,回何敢死?" <论语>:先进篇 百篇博客系列篇.本篇为: v57.xx 鸿蒙内核源码分析(编译 ...

  3. Linux下CPython源码的编译

    最近在看一本python的书CPython Internals,打算研究一下CPython的代码,然后就在Linux(ubuntu)下编译了CPython源码,在此记录一下. 1. 使用git下载cp ...

  4. 在Mac OS X 10.10.3下使用源码包编译安装GCC5.1

    2019独角兽企业重金招聘Python工程师标准>>> 1.首先去下载gcc5.1源码包:https://gcc.gnu.org/ 2.安装: ./configure(可以在这里设置 ...

  5. CentOS 7下MariaDB源码包编译安装

    下载安装包 到官网下载MariaDB 10.2系列稳定版的源码包 选择源码包 点击链接后页面会跳到下载页面,页面中有个信息表格可以填写,这里我们就直接跳过,点击 No thanks, just tak ...

  6. CentOS 7下nginx源码包编译安装

    一.下载 nginx 源码包 这里我们选择稳定版: 把下载完的nginx-1.13.12.tar.gz包上传到服务器上 或者可以在服务器上使用终端下载: [root@localhost ~]# cd ...

  7. OpenBLAS简介及在Windows7 VS2013上源码的编译过程

    OpenBLAS(Open Basic Linear Algebra Subprograms)是开源的基本线性代数子程序库,是一个优化的高性能多核BLAS库,主要包括矩阵与矩阵.矩阵与向量.向量与向量 ...

  8. Spark源码的编译过程详细解读(各版本)(博主推荐)

    本文转自大数据躺过的坑博客园博客,原文链接:xxxxx,如需转载请自行联系原作者说在前面的话 重新试多几次.编译过程中会出现下载某个包的时间太久,这是由于连接网站的过程中会出现假死,按ctrl+c,重 ...

  9. crosswalk源码 的编译过程

    crosswalk 官方:https://github.com/crosswalk-project 编译环境 Ubuntu 16.04 crosswalk 支持的Ubuntu版本 12.04 .14. ...

最新文章

  1. baidu mp3竟然还加密,太扯了
  2. “用手机就能访问卫星” 软件定义升级卫星智能
  3. golang内置接口error
  4. TfidfVectorizer(stop_words='english',ngram_range=(1,1))中ngram_range的意义
  5. 动态调用Web Service
  6. jquery append 动态添加的元素事件on 不起作用的解决方案
  7. 10+ 最佳的 Node.js 教程和实例
  8. [译]5 Mac OS X RSS Readers Worth Giving a Shot
  9. 最短路径之Dijkstra算法
  10. python读取多个文件夹_Python:从文件夹中读取多个json文件
  11. 不服不行!java编程思想第六版下载
  12. Expression Tree 扩展MVC中的 HtmlHelper 和 UrlHelper
  13. 如何在两年内做出一个Apache顶级开源数据库——乔嘉林
  14. 强化学习学习总结(二)——QLearning算法更新和思维决策
  15. pyside6(1):Qt 资源系统和qrc文件使用
  16. kjb文件 解析_十四期全国BIM一级考试真题及解析
  17. war3 魔兽争霸3 双开 多开 联机 补丁 工具
  18. 驾驶员理论考试系统的设计与实现(论文+源码)_kaic
  19. linux重新分区丢失数据恢复,Linux数据恢复专题(1)——恢复丢失的分区(转载)...
  20. 2022年乡村医生考试精选复习题及答案

热门文章

  1. 去除字符串中重复字符
  2. java 对象 方法_java——类、对象、方法
  3. ajax回调函数ifelse,实现AJAX及用Promise解决回调函数命名问题
  4. python参数类型检查_Python中的类型检查
  5. JAVA中的通配符的符号_Linux下的通配符和特殊符号用法详解
  6. 空气培养皿采样后保存_环境监测基础知识——环境空气监测技术之布点采样
  7. win2008服务器系统设置,处理windows 2008系统设置让运行更流畅的方法
  8. 服务器报错:“/usr/local/var/run/nginx.pid”failed
  9. 【大牛系列教学】java商城推荐算法
  10. synchronized底层是怎么实现的?年薪超过80万!