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

初步了解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调用,参与编译过程

发布了304 篇原创文章 · 获赞 26 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_31433709/article/details/105317748