linux下动态库 什么时候会链接错误(附简单例子)

herostarone 2012-08-02 07:46:16
动态库隐式加载:
对应的so动态库文件如果有变更的话,可能整个程序需要重新编译过才能正常运行,而后者不需要。

我想知道什么情况会发生呢?实验如下:
步骤1:编译动态库和可执行函数
libmyapp.h
void myp1();

libmyapp.c
void myp1()
{
printf("world\n");
}
gcc libmyapp.c -fPIC -shared -o libmyapp.so编译后得到libmyapp.so

调用cpp:run.cpp

#include<stdio.h>
#include"libmyapp.h"
int main()
{
myp();
return 0;

}

gcc -rdynamic -ldl -lmyapp -L ./ run.c -o run
得到的run正常运行。

步骤2:修改动态库
libmyapp.h
void myp1();

libmyapp.c
void myp0()
{
printf("world0000\n");
}
void myp1()
{
printf("world\n");
}

void myp2()
{
printf("world2222\n");
}

gcc libmyapp.c -fPIC -shared -o libmyapp.so编译后得到libmyapp.so
本以为直接执行run会发生错误,因为动态库的增加了2个函数,切在原函数前增加了一个,也就是符号表应该变了,但是
直接执行run,程序仍能正常运行。


我测试的可能有问题,如果不会出现这种问题,就不会有COM技术的出现了,但是我的问题在哪里呢?我现在就写个中间处理程序,使动态库发生变化后,不必重新编译应用程序。

...全文
136 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
herostarone 2012-08-03
  • 打赏
  • 举报
回复
或者意思是:dll导出的是一个完成的类,而类的数据成员发生了变化?

[Quote=引用 5 楼 的回复:]

你可以尝试着添加一些成员进去, 打乱结构中成员原来的布局,这样可能就有问题了,不是瞎说的,项目中真实遇到,
这种情况动态库变了,引用程序就得重新编译。

当然这个问题是可以解决的, 方法可以参考Qt库里的设计, 把成员数据封装起来,然后只在类中用指针来指向。
[/Quote]
herostarone 2012-08-03
  • 打赏
  • 举报
回复
您的意思是说:
class.h
...
class.cpp
...

classdll.h
A getAp();

clssdll.cpp
A getAp()
{
return new A;
}
您说的是这种情况吗,然后修改class.h,增加几个数据成员,还是增加几个成员函数啊?




[Quote=引用 5 楼 的回复:]

你可以尝试着添加一些成员进去, 打乱结构中成员原来的布局,这样可能就有问题了,不是瞎说的,项目中真实遇到,
这种情况动态库变了,引用程序就得重新编译。

当然这个问题是可以解决的, 方法可以参考Qt库里的设计, 把成员数据封装起来,然后只在类中用指针来指向。
[/Quote]
帅得不敢出门 2012-08-03
  • 打赏
  • 举报
回复
你可以尝试着添加一些成员进去, 打乱结构中成员原来的布局,这样可能就有问题了,不是瞎说的,项目中真实遇到,
这种情况动态库变了,引用程序就得重新编译。

当然这个问题是可以解决的, 方法可以参考Qt库里的设计, 把成员数据封装起来,然后只在类中用指针来指向。
vilnies 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
恩,我现在只是做测试,用的是gcc,所以不存在extern C的问题,都是简单的C语言

引用 2 楼 的回复:

linux叫共享库。函数声明时要加 extern "C" void function_name() ;
[/Quote]
不好意思,以为是C++的了。
herostarone 2012-08-03
  • 打赏
  • 举报
回复

恩,我现在只是做测试,用的是gcc,所以不存在extern C的问题,都是简单的C语言

[Quote=引用 2 楼 的回复:]

linux叫共享库。函数声明时要加 extern "C" void function_name() ;
[/Quote]
vilnies 2012-08-03
  • 打赏
  • 举报
回复
linux叫共享库。函数声明时要加 extern "C" void function_name() ;

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧