Android 模块mm命令编译时出错

在尝试编译Android2.2/ndk/sources/scanapl目录下的模块时遇到问题。执行mm命令后,Android.mk文件内容未被正确识别导致编译出错。问题出现在设置和执行build/envsetup.sh以及vendorsetup.sh脚本之后,具体编译错误细节未给出。

在android2.2/ndk/sources/scanapl/目录下创建Android.mk和scanapl.c文件

lai@lai-ThinkPad-X61:~/af-t34$ source build/envsetup.sh
including device/htc/dream/vendorsetup.sh
including device/htc/passion/vendorsetup.sh
including device/htc/sapphire/vendorsetup.sh

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

问题描述

创建Android.mk文件,内容如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := scanapl.c
LOCAL_MODULE := scanapl
LOCAL_SHARED_LIBRARIES:= libcutils libutils
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
ubuntu 的termianl中:

lai@lai-ThinkPad-X61:~/af-t34/ndk/sources/scanapl$ mm

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.2
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=FRF91
============================================
make:进入目录'/home/lai/af-t34'
make: *** 没有规则可以创建“out/target/product/generic/obj/EXECUTABLES/scanapl_intermediates/LINKED/scanapl”需要的目标“out/target/product/generic/obj/lib/crtbegin_dynamic.o”。 停止。
make:离开目录“/home/lai/af-t34”

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

解决问题

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := scanapl.c
LOCAL_MODULE := scanapl
LOCAL_SHARED_LIBRARIES:= libcutils libutils
LOCAL_MODULE_TAGS := optional

LOCAL_CFLAGS:= /
	-I/home/lai/ak-t34

include $(BUILD_EXECUTABLE)

添加源文件编译路径,注意 -I/home/lai/ak-t34前面使用的是“TAB”键


### 定义和使用公共变量的方法 在 Android.mk 中编译多个模块时,可以通过定义和使用公共变量来避免重复配置,提高构建脚本的可维护性。公共变量可以在多个模块之间共享,从而简化配置并减少出错的可能性。 #### 1. 在 Android.mk 中定义公共变量 可以通过在 Android.mk 文件中定义一个变量,例如 `COMMON_CXXFLAGS` 或 `COMMON_CFLAGS`,用于存储多个模块共用的编译标志。例如: ```makefile # 定义公共 C++ 编译标志 COMMON_CXXFLAGS := -std=c++17 -Wall # 定义公共 C 编译标志 COMMON_CFLAGS := -Wall -Wextra ``` 这些变量可以在多个模块中重复使用,只需通过 `LOCAL_CXXFLAGS += $(COMMON_CXXFLAGS)` 或 `LOCAL_CFLAGS += $(COMMON_CFLAGS)` 添加到模块的编译标志中 [^1]。 #### 2. 在模块中使用公共变量 定义公共变量后,可以在每个模块中引用这些变量。例如,一个共享库模块和一个可执行文件模块可以分别如下配置: ```makefile # 第一个模块:共享库 include $(CLEAR_VARS) LOCAL_MODULE := my_shared_library LOCAL_SRC_FILES := my_shared_source.cpp LOCAL_CXXFLAGS += $(COMMON_CXXFLAGS) include $(BUILD_SHARED_LIBRARY) # 第二个模块:可执行文件 include $(CLEAR_VARS) LOCAL_MODULE := my_executable LOCAL_SRC_FILES := my_executable_source.cpp LOCAL_CXXFLAGS += $(COMMON_CXXFLAGS) include $(BUILD_EXECUTABLE) ``` 通过这种方式,所有模块都可以使用相同的编译标志,而无需在每个模块中单独定义 [^2]。 #### 3. 使用外部文件管理公共变量 为了进一步集中管理公共变量,可以将这些变量定义在一个单独的 `.mk` 文件中,并在 Android.mk 文件中通过 `include` 引入该文件。例如,创建一个名为 `common_flags.mk` 的文件: ```makefile # common_flags.mk COMMON_CXXFLAGS := -std=c++17 -Wall COMMON_CFLAGS := -Wall -Wextra ``` 然后在 Android.mk 文件中引入该文件: ```makefile # 引入通用编译标志 include $(LOCAL_PATH)/common_flags.mk # 第一个模块:共享库 include $(CLEAR_VARS) LOCAL_MODULE := my_shared_library LOCAL_SRC_FILES := my_shared_source.cpp LOCAL_CXXFLAGS += $(COMMON_CXXFLAGS) include $(BUILD_SHARED_LIBRARY) # 第二个模块:可执行文件 include $(CLEAR_VARS) LOCAL_MODULE := my_executable LOCAL_SRC_FILES := my_executable_source.cpp LOCAL_CXXFLAGS += $(COMMON_CXXFLAGS) include $(BUILD_EXECUTABLE) ``` 这种方法可以实现编译标志的集中管理,避免在每个模块中重复定义相同的标志 [^2]。 #### 4. 公共变量与模块依赖关系 如果某些模块依赖于其他模块的编译标志,可以通过 `LOCAL_SHARED_LIBRARIES` 或 `LOCAL_STATIC_LIBRARIES` 声明依赖关系。构建系统会自动处理依赖模块的编译和链接标志。例如: ```makefile # 第二个模块:可执行文件 include $(CLEAR_VARS) LOCAL_MODULE := my_executable LOCAL_SRC_FILES := my_executable_source.cpp LOCAL_CXXFLAGS += $(COMMON_CXXFLAGS) LOCAL_SHARED_LIBRARIES := my_shared_library include $(BUILD_EXECUTABLE) ``` 在此配置中,`my_executable` 模块依赖于 `my_shared_library` 模块,构建系统会自动处理相关的编译和链接标志 [^3]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值