1.什么是开放源码、编译器与可执行文件?
a> linux真正认识的可执行文件其实是二进制文件(binary file),其实其它的操作系统何尝不也是呢^-^
b> 使用file这个指令来判断文件是否为二进制文件
若为二进制文件而且可以执行的话,则显示:ELF 32-bit LSB executable,同时会说明是否使用动态链接库(shared libs)
若为脚本scripts,则显示: text executable。
c> 编写程序用vi 这个叫原码 ==>经过编译器编译成二进制文件==>可执行文件。
2.什么是函数库?
a> 函数库又分为动态与静态两种。
b> linux核心相关的函数库与外部参数,大多放在/usr/include,/lib,/usr/lib中。
3.什么是configure与make?
a> 软件开发商常会写一个探测程序,来探测使用者的作业环境,以及该环境是否具有软件所需要的其它功能,这个探测程序就叫configure或config
b> configure探测结束之后,会自动的建立makefile(Makefile)
c> 执行make时,make会在当时目录下搜寻makefile,make会自动的判别原码是否经过变动了,而自动更新可执行文件。
4.什么是Tarball套件?
(1)所谓Tarball套件,即将套件的所有原码文件先以tar打包,然后再压缩,常用gzip压缩。这样Tarball套件的文件扩展名为:.tar.gz 或 .tgz。
(2) Tarball 套件里面的文件通常有:
a> 原始文件
b> 探测程序(configure或config)
c> README,INSTALL
5.如何安装Tarball套件?
流程如下:
(1)将套件下载下来
(2)将Tarball解开,产生很多原码文件
(3)以gcc进行原码的编译(生成目标文件object files)
(4)以gcc进行函数库、主、副程序的连接,以形成binary file
(5)将上述binary file以及相关的设定文件安装到主机上。
6.如何升级套件?
(1)为什么要更新?
a> 需要新的功能
b> 安全漏洞
c> 旧版本执行效率不高
(2)更新方法:
a> 以原码通过编译来安装与升级
b> 以编译好的binary file来升级
(3)binary file 升级机制有很多,诸如:
a> Red Hat(含Fedora)的RPM /Up2date /yum 等
b> Mandrake的urpmi
c> Debian的dpkg
d> Sun Unix的pkg
e> apt
7.一个范例:
a> 用vi编辑原码: vi hello.c
# include <stdio.h>
int main(void)
{
printf("Hello World\n");
}
b> gcc编译成可执行binary file: gcc hello.c
不加任何参数,会自动生成一个名为a.out的执行文件。
c> 执行 a.out : ./a.out
d> 加-c参数生成一个与原文件同名的且以 .o 为扩展名的目标文件: gcc -c hello.c
e> 将hello.o利用参数-o生成一个名为hello的执行文件: gcc -o hello hello.o
f> 执行hello : ./hello
g> 编译时,可用参数-l来连接另外的函数库,搜索路径可用-L/path来表示
linux函数库默认放在 /lib 、/usr/lib里
h> Include路径可用参数 -I/path来引用
linux的include文件默认放在/usr/include。
如:编译sin.c时需要libm.so这个函数库,而lib与扩展名(.a 或 .so 可不写)
所以有:
gcc sin.c -lm -L/lib -L/usr/lib
执行: ./a.out
8.gcc的一些用法:
# 仅将原始码编译成为目标文件,并不制作连结等功能:
[root@linux ~]# gcc -c hello.c
# 会自动的产生 hello.o 这个档案,但是并不会产生 binary 执行档。
# 在编译的时候,依据作业环境给予最佳化执行速度
[root@linux ~]# gcc -O hello.c -c
# 会自动的产生 hello.o 这个档案,并且进行最佳化喔!
# 在进行 binary file 制作时,将连结的函式库与相关的路径填入
[root@linux ~]# gcc sin.c -lm -L/usr/lib -I/usr/include
# 这个指令较常下达在最终连结成 binary file 的时候,
# -lm 指的是 libm.so 或 libm.a 这个函式库档案;
# -L 后面接的路径是刚刚上面那个函式库的搜寻目录;
# -I 后面接的是原始码内的 include 档案之所在目录。
# 将编译的结果输出成某个特定档名
[root@linux ~]# gcc -o hello hello.c
# -o 后面接的是要输出的 binary file 檔名
# 在编译的时候,输出较多的讯息说明
[root@linux ~]# gcc -o hello hello.c -Wall
# 加入 -Wall 之后,程序的编译会变的较为严谨一点,
# 所以警告讯息也会显示出来!
9.make 的简易用法:
有四件源文件:test.c haha.c sin_value.c
test.c:
#include <stdio.h>
int main(void)
{
haha();
sin_value();
}
haha.c:
void haha(void)
{
printf("haha this is a c file\n");
}
sin_value.c:
int sin_value(void)
{
float value;
value=sin(3.14/4);
printf("%f\n",value);
}
不用make,一步一步来:
a> 生成目标文件
gcc -c test.c
gcc -c haha.c
gcc -c sin_value.c
b> 生成可执行文件
gcc -o test test.o haha.o sin_value.o -lm
c> 执行
./test
用make的步骤:
a> 生编辑makefile
vi make file
main: test.o haha.o sin_value.o
gcc -o test test.o haha.o sin_value.o -lm <== 这一行开头要用tab键。
b> 删除原有的目标文件
rm -f test *.o
c> make
10.make的好处:
a> 简化编译时所需下达的指令
b> 若在编译完成之后,又修改了某个源文件,则make仅会对被修改了的文件进行编译,其它的目标文件不会被动
c> 最后可以依照相关性为更新执行文件。
11.makefile的语法:
目标:目标文件1 目标文件2
<tab> gcc -o 欲建立的执行文件 目标文件1 目标文件2
12.Tarball包的安装是跨平台的,因为c语言在各个平台上是共通的
13.制作一个可执行的binary file所需要的基础软件包有:
a> gcc或cc等c语言编译器(c compiler)
b> make 简化编译,按照目标文件相关性进行编译
c> autoconfig 探测使用者作业环境
d> 需要kernel的Library以及相关的Include文件
Red Hat当中,与核心相关的功能包含在kernel-source或kernel-header中
14.Tarball安装的基本步骤:
Tarball包是以tar,gzip打包压缩的,首先要解压缩,然后到源码所在目录下进行作业环境的探测同时建立Makefile这个参数设定文件,最后再以make来编译,make install来安装成可执行的binary file。
a> 将tar包在/usr/local/src下解压
b> 进入新建的目录中,查阅INSTALL与README
c> 安装一些必需的相关软件包(非必需)
d> 以configure或config来探测作业环境,并建立Makefile
e> 以make进行编译
f> 以make install 进行安装。
15.Makefile在生成后,里面会包含很多的目标(target),最常见的有install与clean
a> make clean 将目标文件清除
b> make 将原码进行编译
c> make install 安装
16.Tarball软件包安装的指令
a> ./configure 生成参数文件 Makefile
b> make clean 清除目标文件
c> make 源文件 -编译->目标文件-链接函数库->执行文件
这一步生成的可执行文件还放在当前目录中
d>make install 从Makefile中读取参数进行安装
17.Tarball安装时的一些建议:
a> 将tar包下载至/usr/local/src,并在此解压缩
b> 将每个软件包单独安装在/usr/local (这样,删除该文件平,即可视为删除该软件包了)
c> 加上man path
如:将/usr/local/apache的man加到/etc/man.config中
vi /etc/man.config
MANPATH /usr/local/apache/man
18.利用patch更新原始码
a> 生成对比文件 expathc.pathc
diff -Naur expatch.old expatch.new > expatch.patch
b> 更新
patch -p0 < expatch.patch
c> 重新编译安装。
19.函数库依被使用的类型(是否被编译到程序内部)可分为静态(Static)与动态(Dynamic)两种
(1)静态函数库
a> 扩展名: libxxx.a
b> 编译行为: 编译到程序内部(文件可能会大一些)
c> 独立执行: 可以独立执行
d> 升级难易: 难,当函数库升级后,连执行文件也要重新编译一次
(2)动态函数库
a> 扩展名: libxxx.so
b> 编译行为: 没有编译到程序内部,仅是指向
c> 独立执行: 不能
d> 升级难易: 容易
(3)函数库位置:
/lib
/usr/lib
(4)Kernel函数库位置:
/lib/modules
(5)目前,linux大多采用动态函数库
20.将动态函数库载入缓存(Cache)中: ldconfig /etc/ld.so.conf
a> 将想读入cache的动态函数库所在的目录写入/etc/ld.so.conf
b> 利用ldconfig将/etc/ld.so.conf读入cache
c> 同时也将资料记录一份在/etc/ld.so.cache中
如将mysql函数库加入cache中,mysql在/usr/local/mysql中
a> vi /etc/ld.so.conf
加入:/usr/local/mysql
b> ldconfig
21.查看可执行文件含有什么动态函数库: ldd
ldd filename
a> 查看/usr/bin/paswd这个文件的函数库资料
ldd /usr/bin/passwd
b> 查看与/lib/libc.so.6这个函数相关的函数库
ldd /lib/libc.so.6
ldd -v /lib/libc.so.6(显示所有内容)
22.用MD5来检验文件的正确性
md5sum filename
23.wget 下载