Linux系统下的扩展名并不能标识该文件是属于哪一种类型的文件。
文件是否可以执行等都跟文件的扩展名无关。
因为文件script没有执行权限,所以也就无法执行,
sh-3.2# touch ./script
sh-3.2# ls -lh ./script
-rw-r--r-- 1 root root 0 Dec 28 06:15 ./script
sh-3.2#
sh-3.2# ./script
sh: /script: Permission denied
sh-3.2#
sh-3.2# chmod 755 ./script
sh-3.2# ./script
sh-3.2# echo $?
0
sh-3.2#
在Linux系统中,虽然扩展名也和具体的程序相关联。
但文件是否可以执行却是跟扩展名无关的。
也许这种关联是为了管理上的方便吧?
Linux系统下常见的扩展名有:
.sh,通常用来表明这个文件是一个shell script文件;
.so(shared object),共享库文件,这和windows系统下的dll很像,它可以在程序运行时动态装载;
.ko(kernel object),这是从Linux内核版本2.6之后才有的,它又通常被称之为模块(module);
.o,即编译某个源文件所生成的目标文件;
.a,即静态库文件,它会在编译阶段就被打包到可执行程序中;
Linux系统支持.so和.ko,所以它使得模块化变得简单。
那要如何根据需要编译出自己的.so或.ko?
这就要看Makefile文件怎么写了,要透过Makefile向编译器(gcc)传递正确的编译参数,
这样编译器就会根据用户的需求编译出对应的文件。
比如在Makefile中向编译器指定-shared参数,那编译器就知道用户是需要编译一个
.so档案出来。
简言之:
编译器最终的输出结果是由Makefile中的配置决定的;
Makefile是由用户根据需要设定的。
gcc的命令行参数有:
链接选项、优化选项以及c语言选项等等。
软件=程序+文档,
程序=算法+数据结构