当前位置:网站首页>GCC:编译时库路径和运行时库路径
GCC:编译时库路径和运行时库路径
2022-08-05 00:40:00 【风静如云】
假设有如下依赖关系的一个程序:
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
边栏推荐
猜你喜欢
redis可视化管理软件Redis Desktop Manager2022
Mysql_14 存储引擎
[FreeRTOS] FreeRTOS and stm32 built-in stack occupancy
MongoDB搭建及基础操作
B站7月榜单丨飞瓜数据B站UP主排行榜发布!
Inter-process communication and inter-thread communication
Mysql_13 事务
MAUI Blazor 权限经验分享 (定位,使用相机)
could not build server_names_hash, you should increase server_names_hash_bucket_size: 32
2022杭电多校第三场 K题 Taxi
随机推荐
SV 类的虚方法 多态
2 用D435i运行VINS-fusion
JUC thread pool (1): FutureTask use
Software test interview questions: BIOS, Fat, IDE, Sata, SCSI, Ntfs windows NT?
典型相关分析CCA计算过程
关于我仔细检查审核过关于工作人员页面,返回一个所属行业问题
Helm Chart
软件测试面试题:一套完整的测试应该由哪些阶段组成?
Software Testing Interview Questions: What's the Key to a Good Test Plan?
leetcode: 266. All Palindromic Permutations
tensor.nozero(),面具,面具
软件测试面试题:测试生命周期,测试过程分为几个阶段,以及各阶段的含义及使用的方法?
2022杭电多校 第三场 B题 Boss Rush
2022牛客多校训练第二场 J题 Link with Arithmetic Progression
软件测试面试题:关于自动化测试工具?
2022杭电多校训练第三场 1009 Package Delivery
E - Distance Sequence (前缀和优化dp
2022 Multi-school Second Session K Question Link with Bracket Sequence I
机器学习(公式推导与代码实现)--sklearn机器学习库
标识符、关键字、常量 和变量(C语言)