linux下动态库 什么时候会链接错误(附简单例子)
动态库隐式加载:
对应的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技术的出现了,但是我的问题在哪里呢?我现在就写个中间处理程序,使动态库发生变化后,不必重新编译应用程序。