gpt4 book ai didi

bash - 来自 Android.mk 的 Shell 脚本调用、标准输出和缺少分隔符错误

转载 作者:行者123 更新时间:2023-11-29 08:52:24 24 4
gpt4 key购买 nike

我有一个简单的 Android.mk 文件:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

$(shell ($(LOCAL_PATH)/echo_test.sh))

LOCAL_MODULE := libecho_test
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)

它所做的有趣的事情是调用“echo_test.sh”bash 脚本。在脚本内容为

的情况下
#!/bin/bash
echo 'echo is working' >&2

#!/bin/bash
echo 'echo is working' >/dev/null

一切正常

当 bash 脚本运行时出现问题

#!/bin/bash
echo 'echo is working'

#!/bin/bash
echo 'echo is working' >&1

那么返回的错误是

Android.mk:4: *** missing separator.  Stop. 

Android NDK 7 以及在构建 Android Ice Cream Sandwich 4.0.3 期间包含此模块时都会发生这种情况。

我真的不明白标准输出和 Android 构建系统有什么关系。有人有解释吗?

最佳答案

Android NDK 构建系统实际上是GNU Make . Android.mk 文件中的所有代码都必须是有效的 make

当您运行 $(shell) 并且不将值存储在变量中时,就好像您将脚本的标准输出复制到您的 Android.mk 文件中一样。也就是说,好像您的文件包含以下内容:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

echo is working

LOCAL_MODULE := libecho_test
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)

.. 这是无效的 make 语法。重定向到脚本中的 >&2 是有效的,因为输出转到错误输出,然后显示在控制台上。

正如 Vishrut 提到的,使用 $(info) 或 $(warning) 来打印消息。或者,如果您真的想在构建期间运行脚本,请将其输出存储在一个变量中:

ECHO_RESULT := $(shell ($(LOCAL_PATH)/echo_test.sh))

在这里您不会看到脚本的回显输出,它进入变量。

关于bash - 来自 Android.mk 的 Shell 脚本调用、标准输出和缺少分隔符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9869349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com