• 学习编译并运行C代码


    以《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# IP地址字符串和数值转换
    Xstream序列化实体
    异步线程及同步控制
    XML序列化与反序列化(转)
    C# Webserice 代理生成工具(WSDL)
    ASP.NET(C#)图片加文字、图片水印(转)
    异步导致UI句柄增加的解决办法
    终于找到WinForm自定义控件不能拖到IDE设计器容器的办法
    C# PropertyGrid控件应用心得(转载)
    GDI_图片半透明效果示例
  • 原文地址:https://www.cnblogs.com/jay54520/p/6921112.html
Copyright © 2020-2023  润新知