假设有如下依赖关系的一个程序:

m 依赖于a

a 依赖于b

//a.c
#include <stdio.h>void b();
void a()
{printf("Here is a call b\n");b();
}
//b.c
#include <stdio.h>void b()
{printf("Here is b\n");
}
//m.c
#include <stdio.h>void a();int main()
{a();return 0;
}

编译动态库liba.so和libb.so:

gcc -fpic -shared a.c -o liba.so

gcc -fpic -shared b.c -o libb.so

编译并连接程序m可能会遇到以下问题:

1.直接编译连接m

gcc -o m m.c

因为无法找到m直接依赖的动态库liba.so中定义的函数a,所以报错:
/usr/bin/ld: /tmp/ccpoXOmH.o: in function `main':
m.c:(.text+0xe): undefined reference to `a'
collect2: error: ld returned 1 exit status

2.编译指定动态库a和b:

gcc -o m m.c -la -lb

由于默认的库文件路径里没有包含当前目录,因此报错:
/usr/bin/ld: 找不到 -la
/usr/bin/ld: 找不到 -lb
collect2: error: ld returned 1 exit status

可以通过两种方式解决:

  • 通过编译时参数-L,指定在当前目录下寻找库文件

gcc -o m m.c -la -lb -L .

  • 通过设置LIBRARY_PATH

        export LIBRARY_PATH=./:$LIBRARY_PATH

gcc -o m m.c -la -lb

3.运行期错误:

./m
./m: error while loading shared libraries: liba.so: cannot open shared object file: No such file or directory

这是由于在程序m加载时,无法在运行期连接库,因此报错。

可以通过设置LD_LIBRARY_PATH,解决运行期连接错误:

export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH

./m
Here is a call b
Here is b

GCC:编译时库路径和运行时库路径相关推荐

  1. c++ 编译时函数匹配和运行时类型识别

    重载:在同一个作用域下面同名不同参的两个函数互为重载函数: 覆盖:父类的虚函数在子类中重写了,同名同参的父类虚函数被重写: 隐藏:父类中的某个函数名为fun(int,double)函数,子类中同名函数 ...

  2. Tips--windows系统下gcc编译C文件为so共享库

    windows系统下gcc编译C文件为so共享库 1. windows系统安装gcc编译工具 2. 利用gcc编译多个c文件 3. 利用python工具验证生成的so共享库 1. windows系统安 ...

  3. 在linux下面使用Jsoncpp,在编译时添加了头文件搜索路径-Ixxxx/json ,导致很多错误,如下: In file included from /usr/include/x86_64-li

    在linux下面使用Jsoncpp,在编译时添加了头文件搜索路径-Ixxxx/json ,导致很多错误,如下: In file included from /usr/include/x86_64-li ...

  4. Linux下gcc编译中关于头文件与库文件搜索路径相关问题

    如何指定GCC的默认头文件路径 网上偶搜得之,以之为宝:) 原地址:http://blog.chinaunix.net/u/28781/showart.php?id=401631 ========== ...

  5. linux下mkdir头文件_整理Linux下gcc编译中关于头文件与库文件搜索路径相关问题

    态库./libpos.so. /root/test/env/lib/libpos.so和/root/test/conf/lib/libpos.so.我们再用源程序 pos_lib.c(见程序5)来创建 ...

  6. 【转】gcc 编译使用动态链接库和静态链接库

    1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有 ...

  7. c语言编译说文件不存在,c语言编译时缺少头文件,库的解决办法

    问题产生原因 我们都知道我们写一个程序不可能所有东西都重头去开发,因此我们会使用一些其它人写好的文件或者说叫做库函数等.但是有时候因为路径的设置不对,或者是文件的丢失,或者是文件版本不对,或者是文件的 ...

  8. gcc编译 -I头文件目录 -L lib库目录 -l动态库文件

    我们用gcc编译程序时,可能会用到"-I"(大写i),"-L"(大写l),"-l"(小写l)等参数,下面做个记录: 例: gcc -o he ...

  9. GCC 编译使用动态链接库和静态链接库

    1 库的分类 根据链接时期的不同,库又有静态库和动态库之分.静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行.有别于 ...

最新文章

  1. 浅谈 iOS 版本号
  2. clover configurator_枯木逢春,用Clover让老电脑从NVME SSD启动 再用叁年没问题
  3. PAT1001 A+B Format (20 分)
  4. 程序人生:入门程序员最容易踩的 7 个坑!
  5. spark应用程序_Sparklens:Spark应用程序优化工具
  6. 洛谷P2480 [SDOI2010]古代猪文(卢卡斯定理+中国剩余定理)
  7. 秒杀场景_解决秒杀超卖问题_04
  8. 我要带徒弟学写JAVA架构,引路架构师之路
  9. Linux省级精品课程申报,2016年度省级精品在线开放课程开始申报啦!
  10. accumulate
  11. web项目搜索框智能提示
  12. PHP获取每个订单下订单商品的数量
  13. SSD Single shot detection 单发多框检测 实现 多尺度锚框 动手学深度学习v2
  14. 如何下载MySQL的驱动包
  15. tar.gz和tar.bz2解压命令
  16. libpng库的移植与使用
  17. 数字电路:常见的锁存器浅析
  18. 考UCPM产品经理证书是否值得?
  19. win10 移动硬盘“拒绝访问”解决方案
  20. 5G通信呼啸而来,对未来WiFi覆盖有何影响?

热门文章

  1. Error: connect ETIMEDOUT xxx.xxx.xx.xxx:xxxx
  2. 海天味业又火了,市值突破五千亿,“卖酱油”甚比“卖茅台”
  3. html binding属性,Style Binding(Style属性绑定)
  4. 医院系统的服务器,医院管理系统云服务器
  5. 图像凹陷css_使用CSS混合创建单色的彩色图像
  6. 计算机新手教程装系统,新手怎么用u盘重装电脑系统|新手重装电脑系统
  7. 5年匠心之作,深度探索Linux虚拟化
  8. 全民一起学python提高片_全民一起玩Python 基础篇+提高篇
  9. [树莓派可视化软件开发]pyqt-tools下载失败问题
  10. 通用的SATO条码打印软件