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

基于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 -v
Reading specs from /usr/lib/gcc-lib/i486-box-Linux/2.7.2/specs
gcc 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" 指示符使得编译器自动将其包含到合适的位置

//要运行本程序,输入可执行文件的路径名
$ ./newhello
Hello, 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.0

3. 设置路径变量
 #RPM_BUILD_DIR=/usr/src/redhat/BUILD
#RPM_SOURCE_DIR=/usr/src/redhat/SOURCES

4. 在/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.rpm
Wrote:/usr/src/redhat/RPMS/I386/hello-1.0-Share.i386.rpm

Source RPM located in
   /usr/src/{redhat|packages}/SRPMS
Binary 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
#hello
Hello,world!
#whereis hello
Hello:/usr/bin/hello
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章