GCC:编译时库路径和运行时库路径
假设有如下依赖关系的一个程序:
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:编译时库路径和运行时库路径相关推荐
- c++ 编译时函数匹配和运行时类型识别
重载:在同一个作用域下面同名不同参的两个函数互为重载函数: 覆盖:父类的虚函数在子类中重写了,同名同参的父类虚函数被重写: 隐藏:父类中的某个函数名为fun(int,double)函数,子类中同名函数 ...
- Tips--windows系统下gcc编译C文件为so共享库
windows系统下gcc编译C文件为so共享库 1. windows系统安装gcc编译工具 2. 利用gcc编译多个c文件 3. 利用python工具验证生成的so共享库 1. windows系统安 ...
- 在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 ...
- Linux下gcc编译中关于头文件与库文件搜索路径相关问题
如何指定GCC的默认头文件路径 网上偶搜得之,以之为宝:) 原地址:http://blog.chinaunix.net/u/28781/showart.php?id=401631 ========== ...
- linux下mkdir头文件_整理Linux下gcc编译中关于头文件与库文件搜索路径相关问题
态库./libpos.so. /root/test/env/lib/libpos.so和/root/test/conf/lib/libpos.so.我们再用源程序 pos_lib.c(见程序5)来创建 ...
- 【转】gcc 编译使用动态链接库和静态链接库
1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有 ...
- c语言编译说文件不存在,c语言编译时缺少头文件,库的解决办法
问题产生原因 我们都知道我们写一个程序不可能所有东西都重头去开发,因此我们会使用一些其它人写好的文件或者说叫做库函数等.但是有时候因为路径的设置不对,或者是文件的丢失,或者是文件版本不对,或者是文件的 ...
- gcc编译 -I头文件目录 -L lib库目录 -l动态库文件
我们用gcc编译程序时,可能会用到"-I"(大写i),"-L"(大写l),"-l"(小写l)等参数,下面做个记录: 例: gcc -o he ...
- GCC 编译使用动态链接库和静态链接库
1 库的分类 根据链接时期的不同,库又有静态库和动态库之分.静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行.有别于 ...
最新文章
- 浅谈 iOS 版本号
- clover configurator_枯木逢春,用Clover让老电脑从NVME SSD启动 再用叁年没问题
- PAT1001 A+B Format (20 分)
- 程序人生:入门程序员最容易踩的 7 个坑!
- spark应用程序_Sparklens:Spark应用程序优化工具
- 洛谷P2480 [SDOI2010]古代猪文(卢卡斯定理+中国剩余定理)
- 秒杀场景_解决秒杀超卖问题_04
- 我要带徒弟学写JAVA架构,引路架构师之路
- Linux省级精品课程申报,2016年度省级精品在线开放课程开始申报啦!
- accumulate
- web项目搜索框智能提示
- PHP获取每个订单下订单商品的数量
- SSD Single shot detection 单发多框检测 实现 多尺度锚框 动手学深度学习v2
- 如何下载MySQL的驱动包
- tar.gz和tar.bz2解压命令
- libpng库的移植与使用
- 数字电路:常见的锁存器浅析
- 考UCPM产品经理证书是否值得?
- win10 移动硬盘“拒绝访问”解决方案
- 5G通信呼啸而来,对未来WiFi覆盖有何影响?
热门文章
- Error: connect ETIMEDOUT xxx.xxx.xx.xxx:xxxx
- 海天味业又火了,市值突破五千亿,“卖酱油”甚比“卖茅台”
- html binding属性,Style Binding(Style属性绑定)
- 医院系统的服务器,医院管理系统云服务器
- 图像凹陷css_使用CSS混合创建单色的彩色图像
- 计算机新手教程装系统,新手怎么用u盘重装电脑系统|新手重装电脑系统
- 5年匠心之作,深度探索Linux虚拟化
- 全民一起学python提高片_全民一起玩Python 基础篇+提高篇
- [树莓派可视化软件开发]pyqt-tools下载失败问题
- 通用的SATO条码打印软件