以前写过一个关于linux下用c++写动态链接库无法通过的解决方案,今天看到《linux C程序设计-王者归来》这本书,书中有个更容易的解决方案,特此记录下来
书中使用的是c语言,我改用c++试了一下,依旧可以运行:
先来写动态库文件:
//lib.cpp
1 int add(int a,int b) 2 { 3 return a+b; 4 } 5
(*前面写过一个复杂的,这次就简单些举个例子吧*)
书中运用了导出外部函数的做法,先写了一个使用库函数的头文件
//lib.h extern int add(int,int);
然后写调用函数的main函数
//main.cpp
#include<iostream> #include"lib.h" using namespace std; int main() { int a=5; int b=6; int c; c=add(a,b); cout<<c<<endl; return 0; }
(*注意,这里并没有包含dlfcn.h头文件,也就是并没有使用linux系统库函数来调用动态链接库)
下面就是编译方法的问题了:
对lib.cpp文件使用命令:
g++ -shared -fPIC -o lib.so lib.cpp
执行完成后会得到lib.so文件
下面这一步很重要,要对main.cpp进行编译,执行命令:
g++ main.cpp ./lib.so -o main
(*这里也不实用-ldl操作符来限定)
会自动生成main文件,你去执行一下这个文件,就会发现库函数已经被执行了,比起调用系统调用和extern “C”去消除重载要简单了很多。
(**补充**)
我对比了一下两种方式编译出来的文件(方法一参见博客同分类下的《linux下动态链接库解决方案(一)》)
上图中,代表号2的都是上一次那种方式编译出来的文件,会发现:
本次方式编译出的文件,可执行文件(main相比于main2)较小,而动态链接库文件(lib.so相比于lib2.so)则稍大
通过对比,我个人还是建议使用本次方式编译文件,虽然 编译出来的动态库文件稍大(其实大不了多少),但编译出来的可执行文件就远远小于上一次提出的方式了。
整体看来还是这种方式简单……