- 论坛徽章:
- 0
|
1. 关系就是如果你要用那个lib, 你就应该#include它. 一般它只是用来提供向前声明. 除此之外没有任何关系.
2. o即object file. 它一般用来打包成静态库, 即一个静态库(ar档)包含一个或多个object file.
3. so即shared object. 简单地说就是dll(dynamic linked library), 只不过so一般在unix like系统, dll在MS系统.
4. lib要么是由object files打包成的静态ar档, 要么是so档. C的标准库即libc, 一般是一个so. 标准函数库即标准库. 标准库函数即标准库提供的函数, ex, printf.
5. libc即C标准库. 功能是提供调用例程, 如printf. 不过实际上标准库没那么简单, 先不管, C学到一定程度了再说.
6. glibc即是GNU实现的libc, 简单地说在linux系统上libc, glibc, 标准库是同义词.
=======================
数据结构, 算法, 语言和计算导论之类的才是内功. LZ说的这些东西当然也重要, 也算是内功基础, 不过基础比较扎实后还是会偏向于前者. 即使比较特殊的kernel领域, 最终也仍旧是归结于数据结构和算法, 因为内核就是一个大的数据结构. 说内核里面有OOP抽象之类的先放一边吧. 程序 = 数据机构 + 算法, 其实dijkstra大师从来就没错过, 说dijkstra大师少算东西的才是自以为聪明. 当然, 不管如何语言都是非常非常重要的考量因素, 但仍旧不妨碍dijkstra大师的论断.
C是实践性很强的语言, 刚开始的时候多练习才是王道(VIM + gcc on Linux), 一些基本的数据结构和算法要能信手拈来(链表, 栈, 队列, AVL树, 各种数组排序算法 -- 另外要明白AVL树实际就是快排链表版 -- 不过一般将其时间复杂度分摊到插入/平衡操作上了, 然后基本2分查找[排序是为了查找, 这是基本思想]. 基础没问题了再说吧), 过了这个才去考虑更进一步的事情.
建立起对系统的理解也很重要. 《Linux程序设计》和APUE均可. 这个期间要建立串行和并行, 同步和异步的观念. 要理解同步即阻塞, 异步即通知. 要理解进程和线程. 要区分并行的层次, 比如指令级并行和系统级并行.
杂学Makefile shell脚本之类的需要, 而且有时候往往能救命.
接下来再次去理解C语言. 去理解预处理器, 编译器, 汇编器, 链接器都做了什么(真正地理解, 不能太浮于表面. 你可以猜不到编译器做什么, 但你必须要知道预处理和链接器做了什么). 对编译期和运行期要有概念. 要理解二进制文件格式和虚拟内存区域. 要理解栈和调用约定. 要能把汇编当C代码写, 随便哪个平台 -- 重要的是知道汇编器做什么(比如知道指令和伪指令的差别, 知道指令助记符和实际二进制指令的差别), 因为已经理解了栈和调用约定, 所以只要熟悉了指令, 把汇编当C代码写一点问题都没有.
为什么理解链接器做什么是很重要的, 因为要写链接脚本.
然后恭喜你, 你可以在裸机/裸版上构建自己的"操作系统"了. 同时, Linux内核的大门也向你敞开了.
然后没有然后, 这时你自己就知道什么东西是你需要的. 你也可以考虑写一个玩具语言. 简单的玩具语言并不十分困难, 几千行甚至几百行代码就可以做到(几百行来说, 就是一个计算器, 不过可以定义变量什么的).
=======================
然后你还是一个菜鸟, 跟我一样的菜鸟.
=======================
|
|