织梦CMS - 轻松建站从此开始!

罗索

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

落鹤生 发布于 2009-12-17 21:43 点击:次 
其实动态链接库也可以使用静态的方式来嵌入的。本文介绍Linux动态链接库编程入门 (静态连接动态库)
TAG:

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 

(wei801004)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200912/8141.html]
本文出处:CSDN.NET 作者:wei801004
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容