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) |