Linux动态链接库编程入门 (静态连…

Linux动态链接库编程入门 (静态连接动态库)
    originally from http://blog.csdn.net/wei801004/archive/2007/07/27/1711362.aspx

总结(静态连接用DLL):
    1) Linux DLL的C代码和普通代码没有任何区别(缺省),唯一的区别是编译参数
        需要加 - share -fPIC
  动态库名称一定为   libXXXXX.so (后缀一定so, so - standard object)
    2) 动态库的静态连接只要编译时,加库名称就可
        如:   gcc - o exe_file source_file lib_file 

DLL这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。 
下面通过一个简单的例子开始介绍Linux标准对象。 

我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: 

#include 
#include 

void show() { 
      printf("Standard Object by abcde\n"); 

保存为myso.c文件,按照如下编译: 
        $ gcc -fPIC -shared -o libmyso.so myso.c 
执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 

If more than one files, you can use
      g++/gcc   -g   -c   -fPIC   -o   library1.o   library1.cpp   
    g++/gcc   -g   -c   -fPIC   -o   library2.o   library2.cpp   
    g++/gcc   -g   -c   -fPIC   -o   libraryN.o   libraryN.cpp
 link to one dll:    
          g++/gcc   -g   -shared   -o libmydll.so lib1.0 lib2.0 .... libN.o   


不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: 
#include 
int main() { 
        printf("call Linux DLL\n"); 
        show(); 
        return 0; 
保存为invoke.c,按照如下gcc开关编译: 
        $ gcc -o test invoke.c ./libmyso.so 
  ( or  $ gcc -o test invoke.c -lmyso     // 如果libmyso.so已经被放到系统目录或者设置目录)
 
编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 


如下测试结果: 

$ ./test 
    call Linux DLL 
    Standard Object by abcde  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值