以《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. android开发中,在java中怎样使用c提供过来char*

    这个char*假设是一般的字符串的话,作为string传回去就能够了.假设是含有'\0'的buffer,最好作为bytearray传出,由于能够制定copy的length.假设copy到string, ...

  2. 压测过程中,CPU和内存占用率很高,案例简单分析

    Q:  最近公司测试一个接口,数据库采用Mongo    并发策略:并发400个用户,每3秒加载5个用户,持续运行30分钟    数据量:8000条左右 压测结果发现:    TPS始终在5左右   ...

  3. Redis Win平台安装

    安装准备 Redis 官网:https://redis.io/ 中文官网:http://www.redis.cn/ Redis 在Window上并没有提供官方版本.所以可以去微软维护的包库上下载. 下 ...

  4. HttpClient Coder Example

    Example 1:   HttpClient httpClient = new HttpClient();                 httpClient.getHostConfigurati ...

  5. 深入理解Tomcat虚拟文件夹

        我们知道,Web站点中的内容(包含网页,图片,音频文件等)一般都存放在App的文件夹下.但随着站点内容的不断丰富,用户须要把不同层次的内容组织成站点的子文件夹. 我们通常的做法是在站点主文件夹 ...

  6. php对象序列化和cookie的问题,反序列化false

    php对象序列化和cookie的问题,反序列化false $searchKeywords = array("羊奶","肥皂"); $searchKeywords ...

  7. 微信小程序注册开发流程

    开篇: 微信小程序 很多刚学的同学都不太清楚如何去申请这个小程序的appid 现在呢我就一步步的告诉大家这个流程: 首先第1步,百度搜索:微信公众平台-点击右上角的立即注册 第2步:可以看到有4大注册 ...

  8. vue 深入响应式原理

    vue最显著的特性就是不太引人注意的响应式系统(reactivity system),模型层(model)只是普通的javascript对象,修改它则更新视图view.这会让状态管理变得非常简单且直观 ...

  9. spark集群模式

    1.配置集群主机免登陆,参考http://www.cnblogs.com/puroc/p/5996730.html2.修改/etc/hosts文件,增加所有主机名和IP的对应关系 3.修改spark- ...

  10. 介绍两款Linux文件恢复工具,ext3grep与extundelete https://www.cnblogs.com/lazyfang/p/7699994.html

    介绍两款Linux文件恢复工具,ext3grep与extundelete,可能在关键时刻会有所帮助.ext3grep仅对ext3文件系统有效,extundelete对ext3与ext4文件系统都有效  ...