最近在整合C和C++源文件,cpp目录下有多个子文件,然后如果是子目录出现有Android性质的元素时,就会报错。如下图所示
现在如果子目录里出现Android的LOG的日志时,就会报如下的一个错:
Error:(199) undefined reference to `__android_log_print'
但是我已经在gradle里添加了相应的语句了,还是不行。后来查阅了很多资料,也耗了整天时间,发现如果将所有文件打包成一个库,则不会报错,如果在同一个CMakeList文件里生成多个库的时候,就会报错。
解决办法有两种:
第一种就是和我前面所说的,将所有子目录的文件+根目录下所有的文件,都打进一个库里,这样就不会报错了,如下图红框所示,将video_srcs与native-lib打进同一个库。其实这个办法在实际项目中是个不错的办法,因为全部打成一个库,这样别人根据库名字及特征反编译出来就难很多了。所以推荐这个办法;
另一种就是打成多个库,即cpp目录下,根据逻辑的不同,分有多个子文件夹,然后每个子文件夹都打成一个包。如果这样的话,就必须在每个子文件夹下都对应有一个CMakeList文件才行,可以参考这位大佬的经验:
https://www.jianshu.com/p/f09dbaf72126
如上图所示,即可打包成多个库。
但实测我发现,如果这多个库有互相调用的情况下,会报一些无定义的错(但明明已经定义好的了)。这一点至今我还没弄明白,有哪位高手解决下吧= =
查阅资料时,在StackOverflow发现了一个有趣的贴子,就是使用GLOB_RECURSE可以实现根目录、子目录下所有同类的源文件自动添加,如下所示:
file(GLOB_RECURSE cpp_srcs_c "src/main/cpp/*.c")
file(GLOB_RECURSE cpp_srcs_cpp "src/main/cpp/*.cpp")
最后附上这个贴子的地址:https://stackoverflow.com/questions/45209369/android-cmakelist-add-multi-source-file