c语言历史
1978年前后,K&R发明了C语言,并编撰了UNIX操作系统。
1989年,ANSI出版了C语言标准,被称为ANSIC89。
1999年,C标准经历了一次主要的改版。为数值和科学估算平添了一些附加功能,单行注释,for循环中申明变量等等。
2011年gnu 源码,C11标准发布,有了可以编撰子类函数的技巧。
POSIX标准
PortableOperatingSystemInterfaceofUNIX,简写为POSIX。实际上1978年C和UNIX都问世了,到了1988年POSIX标准构建,此后1989年C语言标准构建。当前最新的POSIX标准应当是2008年的标准。C语言标准和POSIX标准之间是存在一定联系的。比如POSIX标准定义了shell脚本怎么工作,以及C程序原希望用到的一些C库。比如C语言的popen(打开管线)就是POSIX标准,而不是C语言定义的内容。POSIX标准的操作系统必须通过支持C99的编译器编译。几乎所有的操作系统都构建在POSIX兼容的基础上,甚至windowsserver也是基于POSIX的。
BSD和GNU是两个有着较高流行度和影响力的POSIX的实现版本,BSD许可证的要求弱于GNU,它要求使用者维持BSD授权源码原有的版权申明和免责申明gnu 源码,但不要求同时提供你的源码。假如你要商用GNU申明过的源码,GNU有权要求你公开源码。
编译环境
编译器,首选gcc
gdb调试器,可以单步执行C代码
Valgrind,用于测试C显存使用错误
Gprof,用于运行效率评测
Make,使你不用直接调用编译器,优化编译过程
pkg-config常用linux系统,用于查找库
doxygen,用于生成程序文档
texteditor,这个就不多说了,每位人都有自己喜欢的编辑器。
开始编撰代码了
#include//erf,sqrt
#include//printf
intmain(){
printf("theintegralofaNormal(0,1)distribution"
"between-1.96and1.96is:%gn",ert(1.96*sqrt(1/2.)));
这段代码没啥好解释的,和helloworld差不多。我们来瞧瞧怎么编译的。
gccerf.c-oerf-lm-g-Wall-O3-std=gnull
-o拿来给出输出的文件名
-lm表示math库须要被链接进来,实际上gcc编译时有一个蕴涵的-lc选项,把libc库链接进来了,否则printf是找不到的。
-g表示加入调试符号,这种符号不会把程序拖慢,而且会减小程序的大小(占用硬碟的大小)。
-std=gnull,准许你使用符合C11和POSIX标准的代码。假如你的代码是C11标准发布之前的,可以使用-std=gnu99
-O3是指优化等级为3级,
-Wall添加编译器告警,你也可以加上-Werror,这么所有告警都当成错误处理,你必须解决所有的编译告警能够得到编译结果。
链接库文件
假如你的代码用到了个库,但是这个库置于某个特定位置,这么你的gcc句子应当如下所示:
gcc-I/usr/local/includeerf.c-oerf-L/usr/local/lib-luserful
-I选项指定编译器的搜索范围,这儿可以找到这个lib的供外部使用的头文件
-L选项指定链接时库的搜索路径
如果你须要用到两个库,并且着两个库又存在依赖关系,这么在gcc中须要按次序给定库的搜索路径。假定libgel依赖libboard,gcc句子如下:
gccerf.o-lborad-lgel
通常来说64位linux,假如你找到一个库文件在/some/path/lib中,这么对应的头文件会在/some/path/include中。
在硬碟中查找库文件是很碍眼的事情,实际上pkg-config维护了一个包含配置信息和位置信息的资料库,假如你的机器中没有,建议安装。
sudoapt-getinstallpkg-config
之后安装libxml
sudoapt-getinstalllibxml2
安装完成以后,我们就可以瞧瞧pkg-config的功能了
ubuntu$pkg-config--libslibxml-2.0
-lxml2//这儿得到的正好是链接是所须要的
ubuntu$pkg-config--cflagslibxml-2.0
-I/usr/include/libxml2//这儿得到的正好是gcc编译时所须要的。
因而gcc句子可以改写为
gcc'pkg-config--cflags--libslibxml-2.0'-oerferf.c
须要提醒的是,不是所有的平台都又pkg-config,也不是每位库都用它注册。
编译器在链接静态库时,是将库里的相关内容直接复制到最终的可执行文件。而共享库是你的程序在运行时链接进去的,此时须要在运行过程中查找库文件。假如你的库在一个非标准的路径,那你须要找到一个更改运行时搜索路径的方式。
假如你用autotools打包你的程序,libtools晓得怎样添加何时的选项。并且假如你使用gcc编译,就须要添加如下句子:
LDADD=-Llibpath-W1,-Rlibpath
-W1是从gcc传递这个选项到联接器。而联接器将给定的-R嵌入所联接的库的运行时搜索路径。
杂记
下一次讲讲常用的makefile句型