再探动态库的应用
代码:
//file:addVec.c #include "vector.h" int gVal = 200; //变量的定义与初始化,在大他区域 int gVal2 = 1; //变量的定义,在bss区域
int addVec(int *xP, int *yP, int *zP, int Num){
for(int i = 0; i < Num; i++){
zP[i] = xP[i] + yP[i];
}
gVal += Num;
return gVal + gVal2;
}
//vector.h
#ifndef vector_h
#define vector_h
int addVec(int *xP, int *yP, int *zP, int Num);
void mulVec(int *xP, int *yP, int *zP, int Num);
#endif
//mulVector.c
#include "vector.h"
void mulVec(int *xP, int *yP, int *zP, int Num){
for(int i = 0; i < Num; i++){
zP[i] = xP[i] * yP[i];
}
return;
}
//testVec.c
#include <stdio.h>
#include "vector.h"
int x[2] = {1, 2};
int y[2] = {3, 4};
int z[2];
extern int gVal; //变量的声明,只能一次定义,可以多次声明
extern int gVal2; //声明一个变量,在其他地方定义的变量
int main(int argc, char **argv)
{
addVec(x, y, z, 2);
printf("z = [%d %d]\n", z[0], z[1]);
return gVal + gVal2;
}
编译动态库:gcc -shared -fPIC -o libVector.so addVec.c mulVec.c
用动态库编译:gcc -g -I. -L. -lVector testVec.o -o testVec
修改变量:LD_LIBRARY_PATH
LD_LIBRARY_PATH=PWD/.
echo $LD_LIBRARY_PATH 结果::/home/nication/WORKM/studyCode/gnuC/chapter04/lib/shared2/. 没有问题
export LD_LIBRARY_PATH
执行:./testVec
结果:z = [4 6]
查看返回变量:echo $? 值为203 正常OK
后续,需要调试时,总是出现断点无法设置在动态库内的情况,在gdb启动后,使用catch load 库名,载入库文件
具体为:
先catch load libVector.so载入库
再设置断点
然后进入库中的函数就可以普通调试
在其他文件中定义的变量,如果需要在另外一个文件中使用时,必须加上extern表明为二次声明
人就像是被蒙着眼推磨的驴子,生活就像一条鞭子;当鞭子抽到你背上时,你就只能一直往前走,虽然连你也不知道要走到什么时候为止,便一直这么坚持着。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2019-12-28 定制vim的状态栏