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
- Linux学习笔记(八)-基于AIX/Linux平台的项目开发
- linux学习笔记八
- 基于ARM的嵌入式Linux开发平台
- 基于ARM的嵌入式Linux开发平台
- 基于ARM的嵌入式Linux开发平台
- 【学习笔记】编译Linux内核(上)--编译基于x86平台的Linux内核的过程
- Linux Shell学习笔记八
- Linux学习笔记(八)
- Linux学习笔记(八)
- Linux学习笔记(八)
- Linux学习笔记(八)
- linux学习笔记(八)
- LINUX学习笔记(八)
- Linux学习笔记(八)-程序开发篇之…
- 我的iphone开发学习笔记(八): 创建NavigationBaseApplication项目
- LINUX学习笔记一(平台的搭建)
- 基于Linux内核的教学平台开发之设想
- 基于Linux、Unix平台的开发是一种趋势么?
- 算法笔记
- 一般系统恢复技术
- Problem C: 让动物们叫起来吧!
- css可继承的属性有哪些?
- 使用CXF+spring+restful创建一个web的接口项目
- Linux学习笔记(八)-基于AIX/Linux平台的项目开发
- 学习淘淘商城第五十课(使用SolrJ管理Solr集群)
- Problem D: 来开个书店吧
- 连接池中的maxIdle,MaxActive,maxWait参数
- SRIO PCIE AURORA三种高速协议的区别
- 转载 Mysql优化 Mysql占用内存优化 CPU多核多线程优化
- A
- 临近性度量方法选取总结
- C、C++基础知识之二 sizeof和strlen之间的区别