以《UNIX网络编程》中的代码为例,学习如何编译并运行C代码。

根据 UNIX网络编程(第3版)环境搭建——使用MAC OSX10.10,能够成功运行

1、下载本书的头文件及示例源码
原书地址:http://www.unpbook.com/src.html

2、解压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等之间的关系)

学习编译并运行C代码的更多相关文章

  1. webpack学习:uni运行时代码解读一 (页面初始化加载)

    uni的vue代码是如何在微信小程序里面执行的,对此比较感兴趣所以去调试学习了一波. 准备工作 // 在vue.config.js里打开非压缩的代码 module.exports = { config ...

  2. 编写一个shell脚本来编译并运行java代码

    概述 编译和运行java分别要用到javac命令和java命令,虽然可以使用IDE(比如eclipse,InteliJ,NetBean...),按一下快捷键就可以实现编译并运行,但是,在之前还要配置一 ...

  3. Linux内核学习--写一个c程序,并在内核中编译,运行

    20140506 今天开始学习伟大的开源代表作:Linux内核.之前的工作流于几个简单命令的应用,因着对Android操作系统的情愫,“忍不住”跟随陈利君老师的步伐,开启OS内核之旅.学习路径之一是直 ...

  4. Lua 学习笔记(七)编译、执行外部代码块

    Lua称为解释型语言的原因:Lua允许在运行源代码之前,先将源代码预编译为一种中间形式.区别解释型语言的主要特征是在于编译器是否是语言运行时库的一部分,即有能力执行动态生成的代码.因为Lua中有dof ...

  5. JAVA_HOME path classpath 以及cmd编译运行java代码

    JAVA_HOME PATH CLASSPATH 三者的区别:安装完jdk之后,首先在环境变量里面添加JAVA_HOME ,例如安装路径为C:\Program Files\Java\jdk1.6.0_ ...

  6. Maven配置插件跳过测试代码的编译和运行

    Maven配置插件跳过测试代码的编译和运行: <!-- 编译插件 --> <plugin> <groupId>org.apache.maven.plugins< ...

  7. C#程序集系列01,用记事本编写C#,IL代码,用DOS命令编译程序集,运行程序

    本篇主要体验:编写C#,IL代码,用"VS2012开发人员命令提示"编译成程序集,并运行程序. □ C#文件编译为程序集 →在F盘创建as文件夹→在as文件夹下创建MyClass. ...

  8. CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码

    CLR是Common Language Runtime的缩写,是.NET程序集或可执行程序运行的一个虚拟环境.CLR用于管理托管代码,但是它本身是由非托管代码编写的,并不是一个包含了托管代码的程序集, ...

  9. 我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行

    习惯了在IDE工具上进行代码编写,连最基本的Javac命令和Java命令都忘记的差不多了,今天对一个Java内部类进行编译和运行的时候,就出糗了.IDE是把双刃剑,它可以什么都帮你做了,你只要敲几行代 ...

随机推荐

  1. Java 内部类种类及使用解析【转】

    内部类Inner Class 将相关的类组织在一起,从而降低了命名空间的混乱. 一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分. Java中的内部类共分为四种: 静态 ...

  2. ios图片轮播效果

    代码地址如下:http://www.demodashi.com/demo/11959.html ImageCarousel 简单封装的图片轮播器 内存过大由于我加载的图片分辨率较高(4k) 文件目录 ...

  3. ibatis常用的集中判断语句

    http://blog.csdn.net/liaomin416100569/article/details/5344483

  4. 【MyBatis学习02】走进MyBatis的世界

    mybatis是个持久层的框架,用来执行数据库操作的,无外乎增删改查,上一节对mybatis有了宏观上的了解后,这一篇博客主要通过一个小示例来入门mybatis,先看一下要写的示例需求: 根据用户id ...

  5. RabbitMQ 学习笔记(一)特点

    RabbitMQ 的具体特点 可靠性: RabbitMQ 使用一些机制来保证可靠性, 如持久化.传输确认及发布确认等. 令灵活的路由: 在消息进入队列之前,通过交换器来路由消息.对于典型的路由功能,R ...

  6. 如何获取UA

    function whatBrowser() { document.Browser.Name.value=navigator.appName; document.Browser.Version.val ...

  7. 一起talk C栗子吧(第八十七回:C语言实例--使用管道进行进程间通信概述)

    各位看官们,大家好.上一回中咱们说的是进程间通信的样例.这一回咱们说的样例是:使用管道进行进程间通信. 闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在前面的的章回中介绍了使用管道进行进程 ...

  8. 快速上手UIView动画

    UIView动画有两种使用方法 UIView [begin commit]模式 //动画开始标记 [UIView beginAnimations:@"changeframe" co ...

  9. 基于AR9331(MIPS架构)分析系统启动过程(uboot)

    前提: 1.AR9331是基于MIPS 24K CPU的一款WIFI1X1芯片,其SDK采用uboot作为引导.AR9331中定义的基地址是:0x9f00,0000 2.MIPS24K芯片,将固定的起 ...

  10. LeetCode459. Repeated Substring Pattern

    Description Given a non-empty string check if it can be constructed by taking a substring of it and ...