Linux学习笔记(八)-基于AIX/Linux平台的项目开发

来源:互联网 发布:电魂网络会被收购吗 编辑:程序博客网 时间:2024/06/09 02:38

基于AIX/Linux平台的项目开发

一. gcc编译工具
1 . gcc基本介绍
- gcc,全称GNU Compiler Collection,是一套GNU开发的编译器环境,它的创始人是Richard.M.Stallman
- gcc不仅可以支持C语言,还可以处理C++,Pascal,Object-C,Java以及Ada等其他语言
- gcc是Linux 的基石,操作系统内核和大部分程序都是gcc 编译的,是Linux下最重要开发工具之一
- 而cc通常是指向gcc的一个链接
2 . 利用gcc的例子
例子1:想得到现在正在使用的gcc的版本号

$ gcc -vReading specs from /usr/lib/gcc-lib/i486-box-Linux/2.7.2/specsgcc version 2.7.2

例子2:gcc构造应用程序

hello.c 示例代码:#include <stdio.h>int main(void){printf("Hello, world!\n");return 0;}//要用 gcc 编译该文件,使用下面的命令:$ gcc -Wall hello.c -o hello//该命令将文件‘hello.c’中的代码编译为机器码并存储在可执行文件 ‘hello’中。//本例中,编译器使用了 -Wall 选项而没产生任何警告,因为示例程序是完全合法的。//机器码的文件名是通过 -o 选项指定的。该选项通常作为命令行中的最后一个参数//注意到如果当前目录中与可执行文件重名的文件已经存在,它将被覆盖//选项 -Wall 开启编译器几乎所有常用的警告──强烈建议始终使用该选项。当编写 C 或 C++ 程序时编译器警告非常有助于检测程序存在的问题

例子3:多个源文件的编译

下面的例子中我们将程序 Hello World 分割成 3 个文件:‘main.c’,‘hello_fn.c’和头文件‘hello.h’

//这是主程序‘main.c’:#include "hello.h"int main(void){hello ("world");return 0;}//文件‘hello.h’中的声明只用了一行就指定了函数 hello 的原型。void hello (const char * name);//函数 hello 的定义在文件‘hello_fn.c’中:#include <stdio.h>#include "hello.h"void hello (const char * name){  printf ("Hello, %s!\n", name);}//要用gcc编译以上源文件,使用下面的命令$ gcc -Wall main.c hello_fn.c -o newhello//本例中,我们使用选项 -o 为可执行文件指定了一个不同的名字 newhello//注意到头文件‘hello.h’并未在命令行中指定。源文件中#include "hello.h" 指示符使得编译器自动将其包含到合适的位置//要运行本程序,输入可执行文件的路径名$ ./newhelloHello, world!//源程序各部分被编译为单一的可执行文件,它与我们先前的例子产生的结果相同

在编译一个包含许多源文件的工程时,若只用一条gcc命令来完成编译是非常浪费时间的。假设项目中有100个源文件需要编译,如果像上面那样仅用一条gcc命令来完成编译工作,那么gcc需要将每个源文件都重新编译一遍,然后再全部连接起来。很显然,这样浪费的时间相当多,尤其是当用户只是修改了其中某一个文件的时候,完全没有必要将每个文件都重新编译一遍,因为很多已经生成的目标文件是不会改变的。要解决这个问题,关键是要灵活运用gcc,同时还要借助像Make这样的工具

二. Makefile的编写
1. 介绍
- 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作
- Makefile定义了整个工程的编译规则。makefile指定了哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令
2 . Makefile的规则

target ... : prerequisites ...     command 
- 这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中- prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容- 在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要以一个Tab键作为开头。- make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令

编写hello程序的makefile

 newhello : main.o hello_fn.o        gcc -o  newhello main.o hello_fn.o main.o : main.c  hello.h        gcc -c main.c hello_fn.o : hello_fn.c hello.h        gcc -c hello_fn.c clean :        rm  newhello  main.o hello_fn.o install:        cp newhello /usr/local/bin

Make命令:在默认的方式下,也就是只输入make命令

1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,会找到“newhello ”这个文件,并把这个文件作为最终的目标文件。3、如果newhello文件不存在,或是newhello所依赖的后面的 .o 文件的文件修改时间要比newhello这个文件新。那么就会执行后面所定义的命令来生成newhello这个文件。4、如果newhello所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。5、这个过程有点像堆栈,最后的目标是生成执行文件newhello。

三. RPM包的创建
1. 创建RPM
- 要想制作一个rpm软件包就必须额外再写一个软件包描述文件(SPEC)
- spec文件中包含了软件包的诸多信息:

-如软件包的名字、版本、类别、说明摘要-创建时要执行什么指令-安装时要执行什么操作-以及软件包所要包含的文件列表等等。

2 .例子:hello的构建
这里写图片描述

1. 在/usr/src/redhat/SOURCES下新建一个hello-1.0目录,vi 左边这三个文件到里面;2. #tar -zcvf  hello-1.0.tar.gz  hello-1.03. 设置路径变量 #RPM_BUILD_DIR=/usr/src/redhat/BUILD#RPM_SOURCE_DIR=/usr/src/redhat/SOURCES4. 在/usr/src/redhat/SPECS下vi 一个hello.spec,具体内容如下页所示;

这里写图片描述

其中%description:软件包详细说明,可写在多个行上
这里写图片描述

  • 预处理段%prep通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备。
  • %prep和下面的%build,%install段一样,除了可以执行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL命令,命令可以有很多行,如我们常写的tar解包命令
//RPM 构建过程#rpmbuild –ba ./hello.spec…..…..Wrote:/usr/src/redhat/SRPMS/hello-1.0_Share.src.rpmWrote:/usr/src/redhat/RPMS/I386/hello-1.0-Share.i386.rpmSource RPM located in   /usr/src/{redhat|packages}/SRPMSBinary RPM located in   /usr/src/{redhat|packages}/RPMS/<arch>Can use binary RPM as any RPM://RPM 构造过程结束后#cd /usr/src/redhat/SRPMS#ls Hello-1.0-Share.src.rpm#rpm-ivh hello-1.0-Share.src.rpm#helloHello,world!#whereis helloHello:/usr/bin/hello
0 0
原创粉丝点击