Chinaunix首页 | 论坛 | 博客
  • 博客访问: 126235
  • 博文数量: 10
  • 博客积分: 725
  • 博客等级: 军士长
  • 技术积分: 157
  • 用 户 组: 普通用户
  • 注册时间: 2005-06-08 10:03
文章分类

全部博文(10)

文章存档

2011年(10)

我的朋友

分类: C/C++

2011-07-18 14:17:18

.o 就相当于windows里的obj文件

.a 是好多个.o合在一起,用于静态连接

.so 是shared object,用于动态连接的,和dll差不多

sotest.c

#include

int test(int a){
        printf("#########:%d\n",a);
        return a;
}
//////////////////

test.c

#include
int test(int a);

int main(int argc,char argv[])
{
        int num=0;
        num =test(2);
        printf("num:%d\n",num);
        return 0;
}
////////////////////////////////

 

分析GCC的两条命令

1.把.c文件变成so库
gcc -shared -o libblog.so input.c
用该命令就把.c文件变成了so库

2.编译.c文件为可执行文件
*如果你在你的.c文件文件中包括了包含so库函数声明的头文件,
则你在编译时用的命令为:
gcc -L/your/lib/path -lblog -o blogexe blogexe.c
以上so库名称必须为libblog.so(linux 省略掉了lib等);
*如果你希望在你的程序里运行时加载,用dlopen的方式打开,使用库里面的函数和数据。
则返回函数的形式( man dlopen 的举例)为:
int (*cos)(double);
cos=dlsym(dl-handle,"cos");
printf("%f",(*cos)(2.0));
或者这样
typedef int (*COSFN)(double);
COSFN cos;
cos=dlsym(dl-handle,"cos");
printf("%f",cos(2.0));
必须这样编译:
gcc -rdynamic -s -o blogexe blogexe.c -ldl

3.cpp文件里面函数和符号的导出
在需要导出变量和函数的前面加上extern "C"


详细说明
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正的代码段共享的目的
-L. :表示要连接的库在当前的目录中
-lmy:编译器查找动态链接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名字

阅读(5270) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~