JCConvert已经在Windows上可以工作,下一步我将在Linux平台上实现这个功能。为了保证对Linux系统so文件理解无误,先在Linux平台上创建一个so文件,并使用测试程序进行测试,其目的就是确认自己的理解是否正确。
第一步是如何生成一个so文件。
1.生成包含文件SoTest.h,代码如下:
需要注意的是:extern "C"修饰符,如果缺少此符号,则在使用dlsym时无法定位函数入口,导致dlsym返回0值。
2.实现代码如下:
代码实现很简单,无须赘述。
3.生成共享库文件(so)
g++ -g -fPIC SoTest.cpp -o libSoTest.so
4.编写静态链接测试程序
执行如下命令生成二进制文件
g++ SoTestStatic.cpp -L. -lSoTest
5.编写动态链接测试程序
执行如下命令,生成二进制代码:
g++ dlsym.cpp -g -ldl
动态链接与静态链接不同在于:
(1)静态链接依赖于包含文件(SoTest.h),而动态链接不需要此文件,只要知道函数的声明格式即可,本例中定义了这样的一个类型:
typedef int (*TCnToNum)(const char*,long long*);
(2)生成二进制的方法不同,静态链接方式依赖于库文件(libSoTest.so)文件,而动态链接直接加载动态库;
(3)使用的函数个数也不相同,静态链接只有一个函数即可实现对共享库的使用;而动态链接方式则需要额外的加载(dlopen)、卸载(dlclose)及函数定位(dlsym)才可以实现对函数的使用;
(4)生成二进制的命令不同,静态链接方式依赖于libSoTest.so文件,动态链接则不需要此文件;