自己瞎写Makefile1.0

之前在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 就是当前目录,在当前目录下再加上路径当然就找不到需要编译的文件了。。φ( °-°)/ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值