主要流程参考官网教程:
需要注意的问题是android Ndk的路径配置,官网的描述如下,有点过于简洁。
用大白话说就是,到源码目录下,执行"./configure"命令,从而运行“configure.sh”。这个脚本涉及很多环境的配置,经过测试确认,除了android ndk的配置选择Yes,其他配置项选择默认路径和No即可。需要注意的是,如果ndk安装的时候,没有按照默认的路径安装,这里一定要手动输入实际的路径以保证指向正确。
配置好ndk路径后,使用以下命令构建tensorflow demo。
bazel build --cxxopt='--std=c++11' -c opt //tensorflow/examples/android:tensorflow_demo
这个过程中,遇到一个很有意思的错误,如下
ERROR: /home/hhc/.cache/bazel/_bazel_hhc/d4e52c148dcdc3ca10bd6768ef14ba79/external/com_google_absl/absl/base/BUILD.bazel:29:1: C++ compilation of rule '@com_google_absl//absl/base:spinlock_wait' failed (Exit 1)
In file included from external/com_google_absl/absl/base/internal/spinlock_wait.cc:27:
In file included from external/com_google_absl/absl/base/internal/spinlock_linux.inc:17:
external/androidndk/ndk/platforms/android-14/arch-arm/usr/include/linux/futex.h:28:21: error: field has incomplete type 'struct robust_list'
struct robust_list __user *next;
^
external/androidndk/ndk/platforms/android-14/arch-arm/usr/include/linux/futex.h:27:8: note: definition of 'robust_list' is not complete until the closing '}'
struct robust_list {
^
external/androidndk/ndk/platforms/android-14/arch-arm/usr/include/linux/futex.h:28:27: error: expected ';' at end of declaration list
struct robust_list __user *next;
^
external/androidndk/ndk/platforms/android-14/arch-arm/usr/include/linux/futex.h:37:27: error: expected ';' at end of declaration list
struct robust_list __user *list_op_pending;
^
3 errors generated.
根据报错信息的路径,找到“futex.h”文件后,其出错的代码如下
struct robust_list {
struct robust_list __user *next;
};
struct robust_list_head {
struct robust_list list;
long futex_offset;
struct robust_list __user *list_op_pending;
};
其中两行中的“__user”编译器不认识,这个符号是个宏,用途大概是linux编译器用来分配变量空间的标志。不知道由于什么原因,这个宏没有定义,所以报错了。根据文件开始处的注释,我们可以知道,这个.h是调用linux相关库函数时用到的声明文件,从语法上来说,直接删除这两个“__user”编译器就不会报错了。也可以谨慎一点,在这里增加下列宏,使得当没有外部定义时,这个符号定义为空。
#ifndef __user
#define __user
#endif
修改完成,静静等待一段时间,ok,编译顺利通过。