CMake编译so库出现“undefined reference to `__android_log_print’”的解决方法

     今天自己新建了个C++工程,想生成so库,新建的工程中使用android日志打印,编译就一直报错,网上查找了下相同的问题,非常多的网友的解决方法都有点些误导,浪费时间。所以在这里说一下问题原因和解决方法。也非常简单。

     我们新建一个包含C++的工程时,AS自动给我们生成了cpp文件和CMakeList配置文件,具体如下:

CMake编译so库出现“undefined reference to `__android_log_print’”的解决方法_第1张图片

     这里就需要大家理解CMake的一些语法了,第一红圈add_library标签定义我们要生成的动态库,动态库的源文件就是后面定义的cpp文件;第二个红圈是查找log库,并将结果赋值给log-lib;第三个红圈是将第二步查找到的log-lib的路径链接到我们要编译生成的目标库文件上,这样我们的目标库文件才能链接到具体的函数。到这里,相信大家也就完全明白问题产生的根因了。我们只是在cpp源文件中引入了#include 头文件,但是头文件中的函数还需要和相应的动态库链接才能找到调用函数。

     明白了这几点,问题就迎刃而解了,要成功编译我们的目标库文件,必须具备以下两个条件:

     1:cpp文件中导入了#include 头库文件;

     2:CMakeList文件中通过find_library标签查找到log库的路径,并且通过target_link_libraries标签将log库和我们目标库进行链接。

     另外有个More than one file was found with OS independent path 'lib/armeabi-v7a/libutils.so'的问题,根因还没查清楚,解决办法如下,完全可以解决问题,请一定注意,在gradle中配置时,一定要写“lib”而不能写“libs”,截图如下:

CMake编译so库出现“undefined reference to `__android_log_print’”的解决方法_第2张图片

     希望能给大家解决实际问题,节省大家的时间!

你可能感兴趣的:(Android异常处理)