bazel编译谷歌tensorflow android demo记录

主要流程参考官网教程:

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android#building-in-android-studio-using-the-tensorflow-aar-from-jcenter

需要注意的问题是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,编译顺利通过。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值