./build_native 时出现please define NDK_ROOT

本文介绍了解决在使用Cygwin进行交叉编译过程中遇到的NDK_ROOT未定义错误的方法。通过调整用户的目录路径,并在.bash_profile中进行相应配置,最终解决了这一难题。

在一次帮朋友弄cygwin交叉编译时出现了这个问题  

cygwin是按照成功了,make-v,以及gcc-v都没出现问题,就是在./build_native 时出现please define NDK_ROOT而且无法进行下去,

经过检查,打入指令pwd发现我的用户没有在home里面而是在c盘里面,

最后把那个C:\Users\Administrator这里添加了.bash_profile文件里面如何修改路径请看我的博客如何生成spk那篇,

如果在home里面一开始没有.bash_profile这个问题,请在d:\cygwin\etc\defaults\etc\skel此目录下可找到,d:cygwin是我安装目录

这样就可以解决了,哎我也是花了一大个晚上的时间,大家共同学习哈

外层makefile在package目录下,但源文件和内层makefile都在与package同一级的其他目录下,内层makefile如下: CFLAGS += -Wall -Werror CFLAGS += -D_BYTE_ORDER=_LITTLE_ENDIAN CFLAGS += -DCONFIG_CTRL_IFACE CFLAGS += -DCONFIG_CTRL_IFACE_UNIX CFLAGS += -DNO_LCHMOD CFLAGS += -Wno-unused-variable INCLUDE_DIRS := INCLUDE_DIRS += ../../wlan_tplink/sdk/qca/qca-hostap/src/common INCLUDE_DIRS += ../../wlan_tplink/sdk/qca/qca-hostap/src/utils INCLUDE_DIRS += ../../wlan_tplink/sdk/qca/qca-hostap/src INCLUDE_DIRS += ../../wlan_tplink/sdk/qca/qca-wifi/os/linux/include INCLUDE_DIRS += ../../wlan_tplink/sdk/qca/libnl-3.4.0/include INCLUDE_DIRS += ../../wlan_tplink/sdk/qca/qca-wifi/include INCLUDE_DIRS += ../../wlan_tplink/sdk/qca/qca-wifi/os/linux/src INCLUDE_DIRS += ../../wlan_tplink/sdk/qca/qca-wifi/umac/airtime_fairness/dispatcher/inc INCLUDE_DIRS += ../../wlan_tplink/sdk/qca/qca-wifi/cmn_dev/umac/cfr/dispatcher/inc INCLUDE_DIRS += ../../wlan_tplink/sdk/qca/qca-wifi/component_dev/tools/linux INCLUDE_DIRS += ../../wlan_tplink/sdk/qca/qca-wifi/umac/son/dispatcher/inc INCLUDE_DIRS += ../../wlan_tplink/sdk/qca/qca-wifi/offload/wlan/lmac_offload_if WPA_CTRL_DIR := ../../wlan_tplink/sdk/qca/qca-hostap/src/common WPA_UTILS_DIR := ../../wlan_tplink/sdk/qca/qca-hostap/src/utils EXTRA_CFLAGS := $(addprefix -I,$(INCLUDE_DIRS)) LDFLAGS = -lpthread -lrt EXTRA_LDFLAGS := FPIC ?= -fpic SRC_C = $(wildcard *.c) SRC_H = $(wildcard *.h) OBJS = $(patsubst %.c,%.o,$(SRC_C)) OBJS += $(WPA_CTRL_DIR)/wpa_ctrl.o OBJS += $(WPA_UTILS_DIR)/os_unix.o OBJS += $(WPA_UTILS_DIR)/wpa_debug.o OBJS += $(WPA_UTILS_DIR)/common.o BIN = wifi_as_wan all: $(BIN) $(OBJS): %.o: %.c $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $< $(BIN): $(OBJS) $(CC) $(LDFLAGS) $(EXTRA_LDFLAGS) -o $@ $^ clean: rm $(OBJS) $(BIN) 此外层makefile怎么编写
最新发布
10-18
你提供了一个非常典型的 OpenWrt 外部模块构建场景: --- ### 📁 项目结构概览(假设): ``` openwrt/ ├── package/ │ └── network/ │ └── wifi-as-wan/ │ └── Makefile ← 外层 Makefile(我们要写的) ├── wlan_tplink/ ← 第三方 SDK 源码目录 │ └── sdk/qca/... └── wifi_as_wan_src/ ← 当前内层 Makefile 所在目录(与 package 同级) ├── wifi_as_wan.c ├── Makefile ← 内层 Makefile(已给出) └── ... ``` 你的目标是: ✅ 使用 OpenWrt 构建系统(`package/.../Makefile`)来编译一个位于 **与 `package` 同一级的独立源码目录** 中的组件,并正确传递头文件路径、编译选项和链接库。 --- ## ✅ 解决方案:编写外层 `package/network/wifi-as-wan/Makefile` 以下是符合 OpenWrt 构建规范的完整外层 Makefile 示例: ```makefile include $(TOPDIR)/rules.mk # 包的基本信息 PKG_NAME := wifi-as-wan PKG_VERSION := 1.0 PKG_RELEASE := 1 # 源码位置(相对于 OpenWrt 根目录) PKG_BUILD_DIR := $(TOPDIR)/wifi_as_wan_src include $(INCLUDE_DIR)/package.mk define Package/wifi-as-wan SECTION := network CATEGORY := Network TITLE := WiFi as WAN service for TP-Link QCA devices DEPENDS := @TARGET_ipq806x||@TARGET_ipq40xx||@TARGET_ipq60xx +libpthread +librt endef define Package/wifi-as-wan/description A daemon that enables WiFi client mode as WAN uplink using QCA vendor SDK. endef # 编译准备(可选:如果需要打补丁或复制文件) define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ endef # 编译命令 define Build/Compile $(MAKE) -C $(PKG_BUILD_DIR) \ CC="$(TARGET_CC)" \ AR="$(TARGET_AR)" \ STRIP="$(TARGET_STRIP)" \ CFLAGS="$(TARGET_CFLAGS) $(FPIC)" \ LDFLAGS="$(TARGET_LDFLAGS) -lpthread -lrt" \ EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \ EXTRA_LDFLAGS="$(EXTRA_LDFLAGS)" \ FPIC="$(FPIC)" \ all endef # 安装到固件镜像中 define Package/wifi-as-wan/install $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) $(PKG_BUILD_DIR)/wifi_as_wan $(1)/usr/sbin/ $(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_BIN) ./files/wifi_as_wan.init $(1)/etc/init.d/wifi_as_wan endef # 清理 define Package/wifi-as-wan/clean -$(_SINGLE)$(MAKE) -C $(PKG_BUILD_DIR) clean endef $(eval $(call BuildPackage,wifi-as-wan)) ``` --- ## 🔍 关键点解释 ### 1. `PKG_BUILD_DIR := $(TOPDIR)/wifi_as_wan_src` - 明确指定源码目录为 OpenWrt 根目录下的 `wifi_as_wan_src` - 这样 OpenWrt 构建系统就知道去哪里执行 `make` ### 2. `EXTRA_CFLAGS` 和 `EXTRA_LDFLAGS` 的传递 你在内层 Makefile 中定义了: ```makefile EXTRA_CFLAGS := $(addprefix -I,$(INCLUDE_DIRS)) ``` 但在外层调用,这个变量不会自动生效。你需要确保它被传入。 #### ❗问题:如何让 `EXTRA_CFLAGS` 在外层可用? 👉 有两种方式: --- ### ✅ 方式一:【推荐】在内层 Makefile 中使用环境变量或默认值 修改 `wifi_as_wan_src/Makefile` 中这行: ```makefile EXTRA_CFLAGS ?= $(addprefix -I,$(INCLUDE_DIRS)) ``` 改为使用 `?=`,表示“如果没有从外部设置,则使用默认值”。 这样你可以在外层覆盖它,也可以让它保留原始逻辑。 然后在外层 Makefile 中不需要再显式赋值,因为内层自己会生成。 --- ### ✅ 方式二:在外层 Makefile 中预先计算并传入 如果你不想改内层代码,可以在外层手动构造这些路径: ```makefile INCLUDE_DIRS := \ ../../wlan_tplink/sdk/qca/qca-hostap/src/common \ ../../wlan_tplink/sdk/qca/qca-hostap/src/utils \ ../../wlan_tplink/sdk/qca/qca-hostap/src \ ../../wlan_tplink/sdk/qca/qca-wifi/os/linux/include \ ../../wlan_tplink/sdk/qca/libnl-3.4.0/include \ ../../wlan_tplink/sdk/qca/qca-wifi/include \ ../../wlan_tplink/sdk/qca/qca-wifi/os/linux/src \ ../../wlan_tplink/sdk/qca/qca-wifi/umac/airtime_fairness/dispatcher/inc \ ../../wlan_tplink/sdk/qca/qca-wifi/cmn_dev/umac/cfr/dispatcher/inc \ ../../wlan_tplink/sdk/qca/qca-wifi/component_dev/tools/linux \ ../../wlan_tplink/sdk/qca/qca-wifi/umac/son/dispatcher/inc \ ../../wlan_tplink/sdk/qca/qca-wifi/offload/wlan/lmac_offload_if EXTRA_CFLAGS := $(addprefix -I$(TOPDIR)/, $(INCLUDE_DIRS)) # 在 Build/Compile 中传递 define Build/Compile $(MAKE) -C $(PKG_BUILD_DIR) \ CC="$(TARGET_CC)" \ CFLAGS="$(TARGET_CFLAGS) $(FPIC)" \ LDFLAGS="$(TARGET_LDFLAGS) -lpthread -lrt" \ EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \ EXTRA_LDFLAGS="-L$(TOPDIR)/some_lib_path -lnl-3" \ FPIC="$(FPIC)" \ all endef ``` > ⚠️ 注意:所有相对路径都必须基于 OpenWrt 根目录展开,所以要用 `$(TOPDIR)/../../xxx` → 改成 `$(TOPDIR)/wlan_tplink/...` --- ### 3. `OBJS` 中依赖的 `.o` 文件来自其他目录 你有: ```makefile OBJS += $(WPA_CTRL_DIR)/wpa_ctrl.o ``` 这意味着你要编译其他目录中的 `.c` 文件。 #### ❗挑战: OpenWrt 默认只编译当前包的源码,不会自动去编译 `../../wlan_tplink/...` 下的 `.c` 文件。 #### ✅ 解决方案: ##### ✅ 方法 A:提前把所需 `.o` 文件预编译好(如静态库),或作为中间产物打包 - 推荐做法:将 `qca-hostap` 部分做成一个独立的库包(`libhostap-common`),先编译安装它。 ##### ✅ 方法 B:在 `Build/Compile` 中先编译依赖对象 ```makefile define Build/Compile # 先编译依赖的 .o 文件 $(MAKE) -C $(TOPDIR)/wlan_tplink/sdk/qca/qca-hostap/src/common \ CC="$(TARGET_CC)" CFLAGS="$(TARGET_CFLAGS) -I." -c -o $(PKG_BUILD_DIR)/wpa_ctrl.o wpa_ctrl.c $(MAKE) -C $(TOPDIR)/wlan_tplink/sdk/qca/qca-hostap/src/utils \ CC="$(TARGET_CC)" CFLAGS="$(TARGET_CFLAGS) -I." -c -o $(PKG_BUILD_DIR)/os_unix.o os_unix.c # 再进入主目录编译主程序 $(MAKE) -C $(PKG_BUILD_DIR) \ CC="$(TARGET_CC)" \ CFLAGS="$(TARGET_CFLAGS) $(FPIC)" \ LDFLAGS="$(TARGET_LDFLAGS) -lpthread -lrt" \ EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \ FPIC="$(FPIC)" \ all endef ``` 但这很繁琐,不推荐长期使用。 --- ### ✅ 最佳实践建议 | 建议 | 说明 | |------|------| | 将 `qca-hostap` 抽象为独立库包 | 用 OpenWrt 的 `BuildPackage` 管理其编译输出 `.a` 或 `.so` | | 主程序链接该库 | 而不是直接编译 `.c` 文件 | | 使用 `STAGING_DIR` 导出头文件和库 | 实现跨包复用 | --- ## ✅ 总结:你现在可以怎么做? 1. ✅ 使用上面提供的外层 Makefile 模板 2. ✅ 修改内层 Makefile 的 `EXTRA_CFLAGS ?=` 避免覆盖问题 3. ✅ 在外层通过 `$(TOPDIR)/path/to/include` 展开所有路径 4. ✅ 如果依赖 `.o` 来自外部目录,考虑将其打包为静态库 5. ✅ 利用 OpenWrt 的 `staging_dir` 和 `BUILD_PATSH` 管理多组件协作 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值