注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

静态库调用动态库  

2011-07-10 21:13:54|  分类: C和C++语言 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
假设我现在个动态库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文件
ar crv libRobin.a robin.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 ..
  评论这张
 
阅读(2774)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017