Linux C 标准头文件一般存放在 /usr/include
gcc -I /usr/openwin/include aa.c // -I可以包含非标准位置的头文件
库是一组预先编译好的函数的集合。一般存放在 /lib和 /usr/lib 目录中。
库文件的名字总是以 lib 开头,随后的部分指出这是什么库(例如,c代表C语言库,m代表数学库)。
文件名的最后部分以 . 开始,然后给出库文件的类型:
.a 代表传统的静态函数库;
.so代表共享函数库函数库通常同时以静态库和共享库两种形式存在,可以用 ls /usr/lib 查看。
你可以通过给出完整的库文件路径名或者用 -l 标志来告诉编译器要搜索的库文件。如:
gcc -o gred fred.c /usr/lib/libm.a
这条命令要求编译器编译文件 fred.c ,将产生编译文件gred,并且除了搜索标准的
**重点内容**C语言函数库外,还要搜索数据库以解决问题。
gcc -o gred fred.c -lm
-lm 是简写的方式,它代表的是标准库目录(/usr/lib)中名为 libm.a的函数库。gcc -o x11fred -L /usr/openwin/lib x11fred.c -lX11
这条命令用 /usr/openwin/lib 目录中的 libxX11 库来编译和链接程序 x11fred.

1.静态库

函数库最简单的形式是一组处于 “准备好使用”状态的目标文件。当程序需要使用函数库中的某个函数时,
它包含一个声明该函数的头文件。编译器和链接器负责将程序代码和函数库结合在一起以组成一个单独的可执行文件。
你必须用 -l 选项指明除了标准库外还需使用的库。静态库,也成做归档文件(archive),按惯例他们的文件名都以 .a 结尾。
你可以很容易的创建和维护自己的静态库,只要用 ar (代表 archive ,即建立归档文件)
程序和使用 gcc -c 命令对函数进行分别编译。你应该尽可能把函数分别保持到不同的源文件中。
如果函数需要访问公共数据,你可以把他们放在同一个源文件中,并使用在该文件中声明的静态变量。
实验:
(1) 为两个函数创建源文件
#include <stdio.h>void fred(int arg)
{printf("fred : we passwd %d\n",arg);
}#include <stdio.h>void bill(char *arg)
{printf("bill : we passwd %s\n",arg);
}

(2) 编译源文件以产生要包含在库文件中的目标文件

-c 的作用是阻止编译器创建一个完整的程序,如果此时试图创建一个完整的程序将不会成功,因为没有main函数。(3)接下来创建一个头文件(lib.h),它一个被所有希望使用你的库文件的应用程序包含。void bill(char*);
void fred(int);(4)调用程序:
#include <stdio.h>
#include "lib.h" //注意用 "",不然会报找不到文件int main()
{bill("Hello,world");exit(0);
}(5)编译并测试:你暂时未编译器显式指定目标文件,然后要求编译器编译你的文件并将其
与之前编译好的目标模块 bill.o 链接。
gcc -c program.c
gcc -o program program.o bill.o


(6)创建归档文件
ar crv 归档文件名 要归档的文件1 要归档的文件2 ...

(7) 某些系统(尤其是 Berkeley UNIX 衍生的系统中),要想成功使用函数库,你还需要为函数库生成一个内容表。
可以通过 ranlib 命令来完成。
ranlib libfoo.a

现在你的函数库可以使用了
gcc -o program program.o libfoo.a

你也可以使用 -l 选项来访问函数库,但因其未保存在标准位置,所以你必须使
用 -L 选项来告诉编译器在何处可以找到它,如下
gcc -o program program.o -L . -lfoo-L . 告诉编译器在当前目录(.)中查找函数库。-lfoo 选项告诉编译器使用名为
libfoo.a的函数库(或者名为 libfoo.so的共享库,如果它存在的话)
要查看那些函数被包含在目标文件,
函数库或可执行文件中,你可以使用nm命令。如果你查看 program和libfoo.a,
你就会发现函数库 libfoo.a中包含 fred 和 bill 2个函数,而 program
里面只包含 bill 函数。当程序被创建时,它只包含函数库中它实际需要的函数。


2.共享库

静态库的缺点是:当你同时运行许多应用程序并且它们都来自同一个函数库的函数时,
内存中就会有同一函数的许多副本,而且在程序文件自身中也有许多同样的副本。这将大量消耗内存和磁盘空间。共享库的保持位置和静态库是一样的,但共享库有不同的文件名后缀。一个典型的Linux系统中,
标准数学库共享库的版本是 /usr/lib/libm.so。
当一个程序使用共享库时,它的链接方式是这样的:程序本身不再包含函数代码,
而是引用运行时可访问的共享代码。当编译好的程序被装载到内存时,函数引用被解析并产生对共享库的调用。
如果有必要,共享库才被加载到内存中。
通过这种方法,系统可以只保留共享库的一份副本供许多应用程序同时使用,并且在磁盘上也仅保留一份。
另外一个好处是共享库的更新独立于以来它的应用程序。例如,文件 /lib/libm.so
就是对实际库文件的修订版本(/lib/libm.so.N, 其中 N 是代表主版本号)的符号连接对 Linux 系统来说,负责装载共享库并解析客户程序函数引用的程序(动态装载器)是 ld.so。
用于搜索共享库的额外位置可以在文件/etc/ld.so.conf 中配置,如果修改了这个文件,
你需要执行命令ldconfig来出来它。
可以通过工具 ldd 来查看一个程序需要的共享库。
在本例中,你看到标准C语言函数库(libc)是共享(.so)。程序需要的主版本号是6.
共享库在许多方面类似于 Windows 的动态链接库。 .so 对应于 .dll文件,
它们都是在程序运行时加载的。而 .a 库类似于 .LIB 文件,它们都包含在可执行文件中。linux    windows
目标文件  func.o   func.obj
静态函数库  lib.a    lib.lib
程序          program    program.exe


经常会遇到两种include引用头文件的情况,其实区别很简单,如下:一、#include< >#include< > 引用的是编译器的类库路径里面的头文件。假如你编译器定义的自带头文件引用在 C:\Keil\c51\INC\ 下面,则 #include<stdio.h> 引用的就是 C:\Keil\c51\INC\stdio.h 这个头文件,不管你的项目在什么目录里, C:\Keil\c51\INC\stdio.h 这个路径就定下来了,一般是引用自带的一些头文件,如:stdio.h、conio.h、string.h、stdlib.h 等等。二、#include ""#include" " 引用的是你程序目录的相对路径中的头文件。假如你的项目目录是在 D:\Projects\tmp\ ,则 #include"my.h" 引用的就是D:\Projects\tmp\my.h 这个头文件,一般是用来引用自己写的一些头文件。如果使用 #include" " ,它是会先在你项目的当前目录查找是否有对应头文件,如果没有,它还是会在对应的引用目录里面查找对应的头文件。例如,使用 #include "stdio.h"如果在你项目目录里面,没有 stdio.h 这个头文件,它还是会定位到 C:\Keil\c51\INC\stdio.h 这个头文件的。

http://blog.csdn.net/stpeace/article/details/47089585

http://blog.csdn.net/princess9/article/details/6785108

http://www.cnblogs.com/yc_sunniwell/archive/2010/07/22/1782685.html

http://blog.chinaunix.net/uid-26833883-id-3219335.html

http://blog.csdn.net/jackie__y/article/details/46805217

http://www.iteye.com/topic/261176

1.Linux 程序设计入门相关推荐

  1. 视频教程-Linux程序设计从入门到实战-C/C++

    Linux程序设计从入门到实战 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿真,计算机视觉,嵌入式图像处理,云安全审计项 ...

  2. Linux内核入门之路 (非广告)

    笔者从开始接触 Linux 内核应该有 4 ~ 5 年了,虽然不敢说非常了解 Linux 内核,但起码也有了点眉目.所以,本文主要想分享一下我的 Linux 内核入门之路,如果对大家有帮助的话,希望能 ...

  3. linux系统程序问题报告,Linux程序设计实验报告.docx

    Linux程序设计实验报告.docx Linux程序设计实验指导书实验类别课内实验 实验课程名称Linux程序设计实验室名称软件工程专业实验室 实验课程编号 000 总 学 时32 学 分 2 适用专 ...

  4. 机器人程序设计入门(C++/Arduino/ROS)(转载2020版)

    本文主要介绍机器人程序设计入门的安装和配置,并通过简洁的示例演示基于Arduino和ROS构建的机器人物联网系统雏形.Arduino和ROS都支持使用C++进行程序设计. ROS+Arduino 安装 ...

  5. 读书笔记之:Linux程序设计(第4版)(ch1-7) [ 学如逆水行舟,不进则退 ]

    <Linux 程序设计>是一本非常好的书,内容很全面,并且对于给出的例子都进行了详细的讲解.并且是通过一个的小型的项目的来讲解的:开始是使用shell进行编程实现,然后逐步进行改进,使用C ...

  6. [Linux] 读书笔记之:Linux程序设计(第4版)(ch1-7) [ 学如逆水行舟,不进则退 ]...

    <Linux 程序设计>是一本非常好的书,内容很全面,并且对于给出的例子都进行了详细的讲解.并且是通过一个的小型的项目的来讲解的:开始是使用shell进行编程实现,然后逐步进行改进,使用C ...

  7. Linux程序设计(第4版)

    查看书籍详细信息: Linux程序设计(第4版) 编辑推荐 最负盛名的Linux程序设计图书 内容全面深入 全球开源社区集体智慧结晶 内容简介 本书讲述了Linux系统及其他UNIX风格的操作系统上的 ...

  8. 读书笔记-Linux程序设计

    文章目录 Linux程序设计 一.入门 二.shell程序设计 三.文件操作 四.linux环境 五.终端 六.使用curses函数库管理基于文本的屏幕 七.数据管理 CSDN 八.MySQL 九.开 ...

  9. Linux快速入门(操作基础)

    Linux快速入门(操作基础) 一.Linux操作系统 Shell简介: shell的原意是外壳,用来形容物体外部的架构.Linux系统的shell作为操作系统的外壳,为用户提供了使用操作系统的接口. ...

  10. Linux 快速入门到实战【一】

    一.操作系统概述 1. 计算机原理 ​ 现代计算机大部分都是基于冯.诺依曼结构,该结构的核心思想是将程序和数据都存放在计算机中,按存储器的存储程序首地址执行程序的第一条指令,然后进行数据的处理计算. ...

最新文章

  1. NSMakeRange基础函数应用
  2. linux各版本代码量,linux各版本对应溢出漏洞总结(溢出代码)
  3. mysql数据库5.7配置文件_MySQL 5.7配置文件参考
  4. 复旦大学女教授告诉你:朋友是什么?
  5. PyInstaller用法
  6. 单例设计模式和多线程
  7. mac vim python3_VIM学习笔记 编译源码(Compile Code)-Python
  8. EasyUI,二级页面内容的操作
  9. 计算机显示文本自定义130%,实训课题目
  10. main在c语言中的作用,main函数在C语言中是怎么定义的?有什么作用?
  11. 2021 年百度之星·程序设计大赛 - 初赛二 1003 魔怔(并查集,联通性,欧拉回路)
  12. aes key iv从mysql_OpenSSL AES 算法中 Key 和 IV 是如何生成的?
  13. 绿幕背景视频抠图替换
  14. C++学生管理系统课程设计
  15. jpg怎么压缩大小?jpg图片如何压缩大小kb?
  16. springboot中druid数据源配置无效的问题和jar包找不到问题
  17. 20210510_AI方面常见试题
  18. Visio中关于跨线的设置
  19. 【每日随笔】毕业论文答辩 ① ( 答辩流程梳理 | 答辩的一些注意点 )
  20. 怎么在自己电脑上搭建一个服务器,以便于外网访问呢?

热门文章

  1. Corporate Action Guidelines Terms
  2. Ubuntu下编译安装OpenCV 2.4.7并读取摄像头[转]
  3. Nginx 进程间通信
  4. 项目交付:把Python项目打包成exe文件供客户使用然后收钱
  5. R爬虫小白入门:Rvest爬链家网+分析(二)
  6. 微信号php756,微信机器人开发者常说的“提62”是什么?微信62数据是什么意思?...
  7. SDRAM之持续中。。。。。。
  8. CSU Scientific Conference
  9. BI前端展示工具评估
  10. debian sources