学习编译并运行C代码
以《UNIX网络编程》中的代码为例,学习如何编译并运行C代码。
根据 UNIX网络编程(第3版)环境搭建——使用MAC OSX10.10,能够成功运行
1、下载本书的头文件及示例源码
原书地址:http://www.unpbook.com/src.html2、解压unpv13e.tar.gz
3、切换到unpv13文件夹后依次执行
./configure cd lib make cd ../libfree make
此处出现了报错:
inet_ntop.c:56:1: error: conflicting types for 'inet_ntop'
inet_ntop(af, src, dst, size)
^
/usr/include/arpa/inet.h:77:13: note: previous declaration is here
const char inet_ntop(int, const void , char , socklen_t);
^
1 error generated.
make: ** [inet_ntop.o] Error 1解决办法:
找到inet_ntop.c
文件把#include <arpa/inet.h>
这行注释掉,再次执行上述命令,成功!接下来执行
cd ../intro make daytimetcpcli
最后执行编译好的daytime文件
./daytimetcpcli 127.0.0.1
运行结果:
connect error: Connection refused
daytime服务被mac关闭了,所以显示为refused,暂时还没找到开启的方法。。。
我们再换个服务器试试
./daytimetcpcli 64.113.32.5
这回成功返回时间!
57179 15-06-06 16:28:22 50 1 0 57.8 UTC(NIST) *
小伙伴们也可以试试其他地址,在这里http://tf.nist.gov/tf-cgi/servers.cgi 可以找到各服务器地址
参考:
http://www.cppfans.org/1411.html
http://blog.csdn.net/zjf280441589/article/details/18660697
现在试试理解各行代码
./configure
它是一个脚本,用来在安装前对系统进行检查,确认系统是否具备了编译软件所需的各种条件。以C语言程序为例,configure脚本会确认系统内是否有编译软件所需的编译器,以及所需的各种头文件和库等。
make
make是一个工具程序(Utility software),经由读取叫做“makefile”的文件,自动化建构软件。
程序的源码里有各种相互包含和连接,因此我们用一个被称为makefile的文件告诉make源码间的相互联系和其它一些必需内容。makefile可以通过make命令的-f参数来指定。默认情况下,如果没有具体指定,make命令会依次尝试 一些默认文件名, 常见的有makefile和Makefile(推荐)等。
make 与 make filename 有什么不同?
我在 tcpcliserv 进行 make tcpcli01.c 提示:
make: Nothing to be done for `tcpserv01.c'.
而使用 make 就编译完了所有的 c 文件。为什么上面这里是一口气编译完,而上面要 make filename 一个一个来编译?
Makefile是怎么来的
makefile是用configure脚本后自动生成的。源码包内一般会有一个Makefile.in文件,它是生成makefile的模版。configure脚本会检查你的系统,然后用收集到的信息结合Makefile.in模板来生成最终的makefile文件。
不过Makefile.in这个模板又是哪里来的呢?是否所有的源码编译时都用同一套Makefile模板来生成makefile?前面提到的configure脚本呢?它又从哪里来?每个源码包内的configure都一样吗?
autotools自动打包工具
通过上面讲的流程进行编译的源码都采用了一套叫做autotools的工具包来处理源码管理中的一些繁琐步骤。Autotools包含了autoscan, autoconf, automake等工具。
程序员完成了程序的源码后,如果用autotools进行发布前的准备工作,首先会在项目的目录下运行autoscan程序,它会检查目录下面的源码后生成一个configure.scan文件(这是configure脚本的爷爷),然后我们需要对configure.scan进行一些手动的更改(像生成的makefile的文件名之类都可以在这一步更改),然后将其另存为configure.ac(这是configure脚本的爸爸)。如果项目不大,configure.ac文件可能都不会超过20行。最后,用到前文提到的autotools中的autoconf来把configure.ac转换成最终的configure脚本(这是儿子)。
接下来讲Makefile.in。前面已经讲到,Makefile(这是儿子)往往会又长又复杂,需要用configure脚本结合Makefile.in(这是Makefile的爸爸)来自动生成。但事实上,Makefile.in这个模版也常常会又长又复杂,手写的话也不是省心的事。所以我们会用autotools中的automake来生成Makefile.in,真正需要程序员手写的是一个叫Makefile.am(这是Makefile的爷爷)的文件,这个文件里用特定的语法指明了要生成什么目标,由什么源文件生成,要安装到哪个目录等。
概括一下make和automake之间关系:
make是一个工具程序(Utility software),经由读取叫做“makefile”的文件,自动化建构软件;
Automake是一种编程工具,可以产生供make程式使用的makefile。
最后就是将源码打包准备发布了。autotools简化了这项工作,只要运行如下命令,它就能把源码和必要的configure, Makefile等打包成用于发布的软件包了。
cc 与 make 的区别是什么?
cc 是什么
首先,如果讨论范围在Unix和Linux之间,那么cc和gcc不是同一个东西。cc来自于Unix的c语言编译器,是 c compiler 的缩写。gcc来自Linux世界,是GNU compiler collection 的缩写,注意这是一个编译器集合,不仅仅是c或c++。
其次, 如果讨论范围仅限于Linux,我们可以认为它们是一样的,在Linux下调用cc时,其实际上并不指向unix的cc编译器,而是指向了gcc,也就是说cc是gcc的一个链接(快捷方式)
gcc is a compiler, make is a tool to help build programs.
在入门时直接通过 gcc 就能编译,而现在要使用 make 进行构建。是因为文件多了,并且构建存在先后顺序吗?
参考
编译软件的流程(configure, make和autotools等之间的关系)