默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,通常通过源码包进行安装时,如果不指定--prefix,会将库安装在/usr/local/lib目录下;当运行程序需要链接动态库时,提示找不到相关的.so库,会报错。也就是说,/usr/local/lib目录不在系统默认的库搜索目录中,需要将目录加进去。
配置验证码实现类so文件
1、首先打开/etc/ld.so.conf文件。
2、在include ld.so.conf.d/星号.conf下面一行,添加/usr/local/seal/release_dll,前面不需要加include。目的是为了导入验证码生成的动态库so文件。
3、保存后,在命令行终端执行:/sbin/ldconfig -v,使加入的配置生效,缓存到/etc/ld.so.cache文件中。之后,就可以使用验证码的so动态库文件。
**上面加完之后如果还有问题,需要在/etc/profile文件添加“export LD_LIBRARY_PATH=/usr/local/seal/release_dll”
安装swig
1、解压swig-4.0.2.tar
2、进入解压后的目录,依次运行指令:
bash ./configure --prefix=/usr/local/swig-4.0.0 --without-pcre【即不需要安装pcre依赖】
make && make install
3、配置环境变量:
(1)
export PATH=$ANT_HOME/bin:$PATH(貌似没用) $ANT_HOME不存在
export PATH=/usr/local/swig-4.0.0/bin:$PATH(关闭终端即消失,不是永久配置)
(2)
vim /etc/bashrc
# 在最后一行加上
export PATH=$PATH:/usr/local/swig-4.0.0/bin
手动 source /etc/bashrc 生效
4、查看是否安装成功
swig -version
编写swig使用的.i文件
1、引入C++头文件,module貌似和生成的java文件名有关系
%module SwigVerifyCode
%{
#include "GenVerifyCode.h"
%}
%include "GenVerifyCode.h"
swig生成文件
1、基于编写好的.i文件,使用swig命令生成java类和C++接口的wrap文件
swig -c++ -java -package com.code -outdir /usr/local/seal/release_dll/codejava -o /usr/local/seal/release_dll/code/swigVerifyCode_wrap.cpp /usr/local/seal/release_dll/code/swigVerifyCode.i
参数:
com.code:Java文件包名
/usr/local/seal/release_dll/codejava:生成的java文件保存目录
/usr/local/seal/release_dll/code/swigVerifyCode_wrap.cpp:指定.i文件生成的cpp文件位置和名称
/usr/local/seal/release_dll/code/swigVerifyCode.i:使用.i文件生成java代码
2、编译temp下所有java文件为class文件
javac /usr/local/seal/release_dll/codejava/(*).java
3、创建/com/code文件夹,移动生成的.class文件到/com/code文件夹下
mv /usr/local/seal/release_dll/codejava/(*).class /com/code
4、封装成jar包
jar -cvf /usr/local/seal/release_dll/verifycode-java.jar /com/code
5、封装.so包,生成.o文件
注意:因为swigVerifyCode_wrap.cxx中需要用到jni.h和jin_md.h,所以需要把其对应的路径包含进来。我的为安装jdk后的路径:
/usr/local/java/include
/usr/local/java/include/linux
在/usr/local/seal/release_dll下执行
gcc -c -fPIC /usr/local/seal/release_dll/code/swigVerifyCode_wrap.cpp -I/usr/local/java/include -I/usr/local/java/include/linux
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
/usr/local/seal/release_dll/code/swigVerifyCode_wrap.cpp:通过.cpp文件生成.o文件
6、连接.o文件为so动态库
gcc -shared -o /usr/local/seal/release_dll/libverifycode.so /usr/local/seal/release_dll/swigVerifyCode_wrap.o
-shared该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
/usr/local/seal/release_dll/libverifycode.so:通过.o文件,生成的.so文件的路径以及名称,必须以是libxxx.so格式
7、在/usr/local/seal/release_dll目录下,将libGenVerifyCode.so和libverifycode.so、swigVerifyCode_wrap.o文件做关联
gcc -L. -lGenVerifyCode -shared -o /usr/local/seal/release_dll/libverifycode.so /usr/local/seal/release_dll/swigVerifyCode_wrap.o
-L.:表示要连接的库在当前目录中
-lGenVerifyCode:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
将test.c与****同级目录****动态库libtest.so链接生成执行文件test:
$ gcc test.c -L. -ltest -o test
测试
编译java测试类,并关联jar包
javac -cp ./release_dll/verifycode-java.jar VerifyCodeTest.java
执行java’文件
java -classpath .:./release_dll/verifycode-java.jar VerifyCodeTest