LLINUX GCC 编译C使用自定义动态链接库.so的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LLINUX GCC 编译C使用自定义动态链接库.so的问题相关的知识,希望对你有一定的参考价值。

我有以下两种不同的编译方式,假设我的test文件需要用到test.so的链接库文件(在同一个文件夹):
gcc test.c -o test1 verify.so
gcc test.c -o test2 ./verify.so
得到的test1在同一文件夹下无法运行,提示找不到test.so文件,网上查是要把相应的路径添加的系统中
得到的test2文件只要在同一文件夹下即可运行!!!
我想知道这是为什么,编译时只有最后一个参数的写法不一样

参考技术A 1. 可以参考如下关于库文件的文章:http://numanal.com/?p=129
2. 在编译文件时最好用-L指明自定义库的存在目录, 利用如下任一语句(.so文件与.c文件在同一目录):
  gcc test.c -o test2 -L./verify.so
  gcc test.c -o test2 -L.
3. 你这里在的问题应该与编译器的某些兼容性有关, 在实际编写程序的时候最好按gcc的语法规范走, 避免不必要的错误.本回答被提问者和网友采纳

静态库与动态库

gcc工作流程和编译原理

  1. 预处理 gcc -E
  2. 编译 gcc -S
  3. 汇编 gcc -c
  4. 链接 没参数
技术分享图片

gcc的参数

  -I 指定头文件的路径
  -o 指定生成的文件名
  -D 在编译的时候给代码定义宏
  -O 优化程序 后面跟 0 1 2 3 这是优化等级
  -Wall 在程序编译的时候提示警告信息 比如定义了变量没有使用
  -g 在程序中添加调试信息
  -c 只编译子程序
  -L 指定所用的库的目录
  -l 指定库的名字 掐头去尾

静态库的制作

  1>.命名规则

    lib + 库的名字 + .a 例如 libmytest.a

  2>.制作步骤

    1). 生成对应的.o文件 --------- .c --->.o -c
    2). 将生成的.o文件打包 ar rcs + 静态库的名字(libmytest.a)+ 生成的所有的.o

  3>.发布和使用静态库:

    1). 发布静态库
    2). 头文件
技术分享图片

  4>.静态库的优缺点:(由于库在编译的时候直接被打包到应用程序中,所以会有对应的优缺点)

    优点:
      1).发布程序的时候,不需要提供对应的库
      2).加载库的速度快
    缺点:
      1).库被打包到应用程序中,导致应用程序的体积很大
      2).库一旦发生了改变,应用程序都需要重新编译

动态库(共享库)的制作和使用:

1>.命名规则:

  1). lib + 名字 + .so

2>.制作步骤:

  1). 生成与位置无关的代码(生成与位置无关的.o) gcc -fPIC -c *.c 多个参数-fPIC
  2). 将.o打包成共享库(动态库)
技术分享图片

3>.发布和使用共享库

4>. 解决程序执行时动态库无法被加载的问题:

  1)放到系统的库目录中 --- 不允许使用
  2) 临时测试 (终端关闭后就会失效)
    环境变量: LD_LIBRAREY_PATH 将动态库的路径设置给该变量
    将设置的值,导入到系统环境变量中: export LD_LIBRARY_PATH
  3) 不常用的方法(永久设置):
    在家目录的.bashrc文件中添加一句话: export LD_LIBRATRY_PATH=动态库目录的绝对路径
    .bashrc修改完成,需要重启终端
  4)
    1. 需要找到动态连接器的配置文件 -- /etc/ld.so.conf
    2. 动态库的路径写到配置文件中(绝对路径)
    3. 更新 --- sudo ldconfig -v

5>. 动态库的优缺点

  优点
    1. 执行程序体积小
    2. 动态库如果更新了 不需要重新编译程序 (函数接口不变)
  缺点:
    1.发布程序的时候,需要将动态库提供给用户
    2.动态库没有被打包到应用程序中,所以调用起来相对较慢一些

以上是关于LLINUX GCC 编译C使用自定义动态链接库.so的问题的主要内容,如果未能解决你的问题,请参考以下文章

静态库与动态库

Linux下gcc编译生成动态链接库*.so文件并调用它转载

利用GCC编译器生成动态链接库和静态链接库

如何编译C/Fortran动态/静态链接库

gcc升级后静态库要升级吗

Linux C gcc的使用