`
java-mans
  • 浏览: 11343291 次
文章分类
社区版块
存档分类
最新评论

静态库调用动态库

 
阅读更多
假设我现在个动态库A,它有个函数叫A_Function(),同时我又有个静态库B,静态库B有个函数B_Function(),该函数又使用了动态库A的A_Function()函数。
那么此时它是动态调用呢?还是静态库B在进行编译时会把动态库A的A_Function()函数的相关代码拷贝过来,运行时进行静态调用呢?
经过写程序测试,终于得出结论:是动态调用。即静态库对动态库的调用仍然是动态调用。也就是说如果我写了个程序C,它调用静态库B的函数B_Function()的话,我们不仅在编译程序C需要动态库A,而且运行程序C时仍然需要动态库A
测试程序
测试程序共有3个目录src,src2,src3
src目录下有两个文件robinDynamic.h,robinDynamic.c.
它们用于生产动态库,其源码如下
robinDynamic.h文件
#ifndef robin_dynamic_H
#define robin_dynamic_H
#include <stdio.h>
void sayHelloWorld();
#endif
robinDynamic.c文件
#include "robinDynamic.h"
void sayHelloWorld()
{
printf("this is my first helloworld \n");
}
src2目录下也有两个文件robin.h,robin.c,它们用于生成静态库,其源码如下
robin.h文件
#ifndef _robin_H
#define _robin_H
void sayHello();
#endif
robin.c文件
#include "../src/robinDynamic.h"
#include "robin.h"
void sayHello()
{
sayHelloWorld();
}
src3目录下只有一个文件
#include "../src2/robin.h"
int main()
{
sayHello();
return 0;
}
编译脚本
cd src
echo 编译动态库RobinDynamic
gcc robinDynamic.c-fPIC-shared-o libRobinDynamic.so
cd ../src2
cp ../src/libRobinDynamic.so .
echo 编译静态库Robin
gcc robin.c-c-L.-lRobinDynamic-o robin.o
echo 把动态库RobinDynamic和静态库Robin打包进.a文件
arcrvlibRobin.arobin.o
cd ../src3
cp ../src2/libRobin.a .
cp ../src/libRobinDynamic.so .
echo 编译test程序
gcc test.c-L.-lRobin-lRobinDynamic-o test.exe
rm libRobin.a
rm libRobinDynamic.so
echo 在没动态库RobinDynamic的下情况,运行test程序
./test.exe
cp ../src/libRobinDynamic.so .
echo 拷贝动态库RobinDynamic到当前目录下后,运行test程序
./test.exe
cd ..
<wbr style="line-height:25px"></wbr>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics