Linux的.a、.so和.o文件

  1. .o 是中间结果,对应每个.c文件,对每个.c文件进行到汇编阶段,不链接
  2. 好多个.o文件合在一起,构成一个.a文件
  3. .a文件时静态库,.so文件时动态库
  4. 使用ar(archiver)命令生成.a,ar rcs mylib.a f1.o f2.o
  5. 用gcc生成可执行代码时,使用-l参数指定要加入的库函数。也可以用ld命令的-l和-L参数
  6. lib+函数库名+.so+版本号信息(但是记住,非常底层的C库函数都不是以lib开头命名的)。例子:/usr/lib/libreadline.so.3
    a. 编译器编译的时候需要的函数库的名字就是不包含版本号信息的soname,例如上面的例子把最后的.3去掉就可以了
  7. 共享函数库文件必须放在特定目录,对于开放源码来说,GNU标准建议所有的函数库文件都放在/usr/local/lib目录下,而且建议命令、可执行程序都放在/usr/local/bin目录下。不过这个只是习惯啦,可以改变,具体的位置信息可以看/etc/ld.so.conf里面的配置信息。当然,也可以修改这个文件,加入自己的一些特殊的路径要求。

编译相关

  1. 编译的最小单元是.c文件,首先将.c文件编译成.o
  2. 使用-c选项可告诉编译器只进行汇编生成.o,而不进行链接
  3. -fPIC,生成动态库时使用,告诉编译器生成与位置无关的的代码。即符号的地址都是绝对地址。PIC,Position Independent Code。
  4. 如何找到新生成的动态库
    a) 把库拷贝到/usr/lib和/lib下
    b) LD_LIBRARY_PATH环境变量加上库的位置
    c) 修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾(直接写在文件末尾,不要在路径前加include),并执行ldconfig刷新(ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.)。这样,加入的目录下的所有库文件都可见

你可能感兴趣的:(linux,linux)