一、背景
UOS_x86系统,使用cmake编译了一个c++的动态库,然后java通过JNI调用该动态库。编译阶段没有任何报错,但是运行该动态库时报了如下图的错误:
二、分析
目测最后这一串ZN5boost6locale4util17get_system_localeB5cxx11Eb
表示跟boost有关,
于是一次运行以下两行代码,得到如下图的结果,结果显示是说:boost::locale::util::get_system_locale()没有定义
查了一些别的帖子说是这个boost::locale库没有正确链接,但是我看了cmke编译的过程,boost/locale.hpp有正确读取到,那为啥到了运行的时候就找不到了呢?
于是我仔细查看了一遍跟这个libYeecohImageKit.so动态库相关的所有CMakelist.txt(我这个项目比较大,采用了多层CMakelist.txt)发现在生成这个动态库的那个CMakelist.txt中下面的这行语句被注释掉了,target_link_libraries()的作用就是指定要链接的静态库
,那么原因就找到了,因为在别的CMakelist.txt中有链接boost库的操作所以在cmake编译的过程中可以看到boost出现,但是生成libYeecohImageKit.so的Cmakelist中把这两句注释掉了,所以这个库就没有正确的链接boost库,在运行的时候就找不到对应的定义
将这几句代码取消注释,正确运行了~