之前在tensorflow-master上用bazel编这好好的程序,挪到android源码里就沙比了。。。没办法只能用Makefile整体编译。。。然而作为菜鸟并不会写Makefile。这里大概写一下涉及到的规则和注意事项。
首先,目标是吧build文件的内容和功能迁移出来。
cc_library(
name = "bitmap_helpers",
srcs = [
"bitmap_helpers.cc",
],
hdrs = [
"bitmap_helpers.h",
"bitmap_helpers_impl.h",
"label_image.h",
],
deps = [
"//tensorflow/contrib/lite:builtin_op_data",
"//tensorflow/contrib/lite:framework",
"//tensorflow/contrib/lite:schema_fbs_version",
"//tensorflow/contrib/lite:string",
"//tensorflow/contrib/lite:string_util",
"//tensorflow/contrib/lite/kernels:builtin_ops",
"//tensorflow/contrib/lite/schema:schema_fbs",
"//tensorflow/core:android_png_internal",
"//tensorflow/core:lib",
"//tensorflow/core:jpeg_internal",
],
)
build里边的写法当然跟makefile不一样==,deps中包含的每一个依赖都需要写成库。
这里的string只有一个头文件,没有.c或者.cc,这种貌似不用写。(O_o)??
以string_util为例,string_util.h和string_util.cc都在tensorflow/contrib/lite目录下边。看一下tensorflow/contrib/lite目录下的build文件:
cc_library(
name = "string_util",
srcs = ["string_util.cc"],
hdrs = ["string_util.h"],
deps = [
":framework",
":string",
],
)
这里有一个源文件string_util.cc和一个头文件string_util.h,模仿其他Makefile库的写法:
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
string_util.cc
LOCAL_C_INCLUDES := \
externals/tensorflow \
externals/gemmlowp \
externals/tensorflow/flatbuffers/include\
externals/tensorflow/tensorflow/contrib/lite
LOCAL_CFLAGS := -Wall -Werror -Wextra -Wno-unused-parameter
LOCAL_CFLAGS += -Wno-extern-c-compat -Wno-mismatched-tags -Wno-sign-compare -Wno-unused-lambda-capture
LOCAL_CFLAGS += -Wno-missing-field-initializers
LOCAL_LDFLAGS := -lpthread -ldl
LOCAL_CPP_EXTENSION := cc
LOCAL_STATIC_LIBRARIES := libtflite_context\
libtflite_framework
LOCAL_SHARED_LIBRARIES := libtflite
LOCAL_MODULE:= libtflite_stringutil
LOCAL_MODULE_TAGS := eng
include $(BUILD_SHARED_LIBRARY)
这里边LOCAL_C_INCLUDES是源文件中的头文件所在的目录,i.e. string_util.h所在的目录,这个需要从根目录开始写,如果string_utils.h所在的目录是a/b/c/d/e/f/string_utils.h。如果string_utils.cc中#include “e/f/string_utils.h”,那么LOCAL_C_INCLUDES应该写为:LOCAL_C_INCLUDES := a/b/c/d。
LOCAL_STATIC_LIBRARIES是当前库编译所依赖的静态库,写到这需要看看string_util.cc文件,string_util.cc文件里边是这么写的:
#include <string.h>
#include <vector>
#include "tensorflow/contrib/lite/context.h"
#include "tensorflow/contrib/lite/interpreter.h"
也就是说,context.h和interpreter.h需要添加进来。找一找他们对应的context.cc和interpreter.cc,看看他们是属于哪个库的:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
context.c
LOCAL_C_INCLUDES := \
externals/tensorflow
LOCAL_STATIC_LIBRARIES :=
LOCAL_CFLAGS := -Wall -Werror -Wextra -Wno-unused-parameter
LOCAL_CFLAGS += -Wno-typedef-redefinition
LOCAL_MODULE:= libtflite_context
LOCAL_MODULE_TAGS := eng
include $(BUILD_STATIC_LIBRARY)
可以看出来context.cc是属于libtflite_context库的,而且libtflite_context是一个静态库。同理可以找到interpreter.cc被动态库libtflite和静态库libtflite_framework编进去了,所以也要引入这两个库。在写的时候用\作为换行符,
注意\后边不能有空格!!!否则会报错:
commands commence before first target
大概就是这样了,最后在当前文件夹下mm一下就可以看看写的对不对了~目前是瞎写一通。。。暂时能编译过,先这样吧,有问题再回来改=。=还有就是啥样的文件应该编译成静态库,啥样编成动态库还不太明白==,明白之后再修改更新吧~~( ・´ω`・ )
~~~~~~~~~~~~~~~~~3.30更新~~~~~~~~~~~~~~~~~~~
关于具体都需要引进一些什么库,目测是用mm命令试一试,根据提示的错误总会知道的。。。(:3_ヽ)_
更新错误:
mm提示
make: *** No rule to make target
结果是因为LOCAL_SRC_FILES写错了╰(:з╰∠)_。。。
如果要编译当前目录下的文件,那么直接写文件的名字就好,不要写路径。
LOCAL_PATH := $(call my-dir)_
因为LOCAL_PATH 就是当前目录,在当前目录下再加上路径当然就找不到需要编译的文件了。。φ( °-°)/