入门(Beginning Linux Programming 笔记1)
原文地址: http://www.hickwu.com/?p=255
作者: Hick
转载请注明出处
前面大多数是看过了很多遍的一些 Unix/Linux 渊源和背景。
p38 Linux 应用程序可以分为可执行程序(二进制)和脚本(文本)两种。
p39 linux shell 下输入命令以后,shell 都会在 PATH 环境变量中设置的路径中查找可执行文件。常见路径:
. /bin 用于系统启动的程序
. /usr/bin 非系统的用户可执行程序,一般都是一些标准的 linux 程序
. /usr/local/bin 同样是用户级的可执行程序,一般是系统安装完成以后另外再安装的程序
作为超级用户,一般 PATH 中还包括 /sbin/ /usr/sbin 。
p42 头文件,linux 环境下的 c 文件一般放在 /usr/include/ 下。linux 下常用的 gcc 可有通过 -I 参数增加头文件的路径: gcc -I/usr/openwin/include fred.c 。
p43 标准库文件一般放在 /lib 或者 /usr/lib 。一般库名都是以 lib 开头的。库又分静态库和动态库,分别为 .a 文件和 .so 文件。编译器可以指定库: gcc -o fred fred.c /usr/lib/libm.a 。以一种更简便的方式,可以 libm.a 的路径可以替换为 -lm ,也就是这样的形式: gcc -o fred fred.c -lm 。意味着 -l 后面紧跟的 m 作为库的 id ,编译器会根据这个 id 去相应目录寻找 libm.a 文件。通过 -L 参数还可以增加 lib 的存放路径: gcc -o x11fred -L/usr/openwin/lib x11fred.c -lX11 ,这里加载的库为 libX11.a (或者 .so)。
p44 静态库的制作可以通过 gcc + ar 命令来完成。首先用 gcc 编译 c 代码成目标文件,比如 gcc -c bill.c fred.c 生成 bill.o fred.o 两个文件。
p45 在 program.c 中调用 bill.c 中的 bill 函数,可以这样的传统方式编译: gcc -c program.c ,然后 gcc -o program program.o bill.o 。
下面的命令可以把 bill.o 和 fred.o 编译成静态库文件: ar crv libfoo.a bill.o fred.o ,然后这样来调用库文件: gcc -o program program.o libfoo.a 。 有些系统需要维护一个库文件表,创建库以后需要用这个命令来告诉系统增加了一个库文件: ranlib libfoo.a ,linux 下这不是必须的。
p46 按照前面的方式,我们可以通过 -L 指定库路径, -l 指定库名,所以也可以用这个命令编译 program.c : gcc –o program program.o –L. –lfoo 。静态库把库文件编译到了可执行程序,不方便升级库文件;如果多个程序使用了同一个静态库,同时调用的时候他们也会占用多不同的内存空间,所以有了动态库 .so 文件,也可以称为共享库。
p47 一般动态库文件 /lib/libm.so 只是实际库文件 /lib/libm.so.N 的一个 link ,其中 N 表示库文件的主版本号。经常会允许多个主版本的动态库文件同事存在,调用动态库的应用程序可以自行选择需要使用的版本。在 suse 下,一般有一个 ld.so 管理动态库,实际名字可能是 ld-linux.so.2 或 ld-lsb.so.2 或 ld-lsb.so.3 。动态库的配置比如寻找动态库的路径配置在 /etc/ld.so.conf 中,如果有修改,可以通过 ldconfig 来使修改生效。
可以通过 ldd 命令查看一个程序比如 program 所依赖的动态库: ldd program 。
linux 下查看一个命令的使用手册,一般可以用 man ,很多 GNU 软件还可以通过 info 命令获得帮助信息。
