学习编译并运行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 refuseddaytime服务被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代码的更多相关文章
- webpack学习:uni运行时代码解读一 (页面初始化加载)
uni的vue代码是如何在微信小程序里面执行的,对此比较感兴趣所以去调试学习了一波. 准备工作 // 在vue.config.js里打开非压缩的代码 module.exports = { config ...
- 编写一个shell脚本来编译并运行java代码
概述 编译和运行java分别要用到javac命令和java命令,虽然可以使用IDE(比如eclipse,InteliJ,NetBean...),按一下快捷键就可以实现编译并运行,但是,在之前还要配置一 ...
- Linux内核学习--写一个c程序,并在内核中编译,运行
20140506 今天开始学习伟大的开源代表作:Linux内核.之前的工作流于几个简单命令的应用,因着对Android操作系统的情愫,“忍不住”跟随陈利君老师的步伐,开启OS内核之旅.学习路径之一是直 ...
- Lua 学习笔记(七)编译、执行外部代码块
Lua称为解释型语言的原因:Lua允许在运行源代码之前,先将源代码预编译为一种中间形式.区别解释型语言的主要特征是在于编译器是否是语言运行时库的一部分,即有能力执行动态生成的代码.因为Lua中有dof ...
- JAVA_HOME path classpath 以及cmd编译运行java代码
JAVA_HOME PATH CLASSPATH 三者的区别:安装完jdk之后,首先在环境变量里面添加JAVA_HOME ,例如安装路径为C:\Program Files\Java\jdk1.6.0_ ...
- Maven配置插件跳过测试代码的编译和运行
Maven配置插件跳过测试代码的编译和运行: <!-- 编译插件 --> <plugin> <groupId>org.apache.maven.plugins< ...
- C#程序集系列01,用记事本编写C#,IL代码,用DOS命令编译程序集,运行程序
本篇主要体验:编写C#,IL代码,用"VS2012开发人员命令提示"编译成程序集,并运行程序. □ C#文件编译为程序集 →在F盘创建as文件夹→在as文件夹下创建MyClass. ...
- CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码
CLR是Common Language Runtime的缩写,是.NET程序集或可执行程序运行的一个虚拟环境.CLR用于管理托管代码,但是它本身是由非托管代码编写的,并不是一个包含了托管代码的程序集, ...
- 我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行
习惯了在IDE工具上进行代码编写,连最基本的Javac命令和Java命令都忘记的差不多了,今天对一个Java内部类进行编译和运行的时候,就出糗了.IDE是把双刃剑,它可以什么都帮你做了,你只要敲几行代 ...
随机推荐
- java 方法传参方式: 按值调用
程序设计语言中将参数传递给方法的几种方式: 按名调用(call by name): Algol 语言采用此方式, 已成为历史; 按值调用(call by value): 方法接收到的是调用者提供的 变 ...
- [1-7] 把时间当做朋友(李笑来)Chapter 7 【从此时此刻开始改变】 摘录
大多数事情都需要提前准备,也都可以提前准备.认识到这一点本身就几乎是一切改变的起点. 任何动作演练到一定的次数,就能做到甚至在无意识的情况下都可以准确完成的地步.而他只不过是把这个原理应用到了极致而已 ...
- MySQL 5.6数据导入报 GTID 相关错误
从阿里云备份数据后还原到本地,用命令行 mysql -uroot -p --default-character-set=<character> -f <dbname> < ...
- 将 ASP.NET Core 2.0 项目升级至 ASP.NET Core 2.1
主要升级步骤如下: 将 .csproj 项目文件中的 target framework 改为 netcoreapp2.1 <TargetFramework>netcoreapp2.1< ...
- Stage3D&Away3D整理ppt
资料下载地址:http://files.cnblogs.com/xignzou/away3D%E6%A1%86%E6%9E%B6%E5%AD%A6%E4%B9%A0%E5%88%86%E4%BA%AB ...
- 美团HD(9)-监听点击城市
DJSelectCityViewController.h // 点击城市发出通知 - (void)tableView:(UITableView *)tableView didSelectRowAtIn ...
- 设备模型的uevent机制
内核模块的热插拔事件的通知基于uevent机制. 当kobject的状态发生改变(如,add, remove等)时,会通知用户空间,用户空间接收到事件通知后可以做相应的处理.uevent把事件上报给用 ...
- 使用Charles对Https请求进行抓包
昨天对某个APP做分析的时候发现其请求是Https的,抓包工具不能正常的显示请求的内容及返回的情况.通过搜索发现Charles是支持针对Https抓包的.具体的操作如下: 1.电脑端安装SSL证书 2 ...
- MapReduce源码分析之JobSubmitter(一)
JobSubmitter,顾名思义,它是MapReduce中作业提交者,而实际上JobSubmitter除了构造方法外,对外提供的唯一一个非private成员变量或方法就是submitJobInter ...
- db2 blob EMPTY_BLOB()
--针对BLOG类型的列,写入一个0长度的字符串