【问题标题】:How to dynamically get the current compiler target file name in Android.mk's LOCAL_CFLAGS?如何在Android.mk的LOCAL_CFLAGS中动态获取当前编译器目标文件名?
【发布时间】:2016-04-19 14:39:36
【问题描述】:

我目前正在尝试使用 Android 的 NDK 构建本机模块。我的项目包含几个源文件(例如:FILENAME.c),对于每个源文件,我需要在其 CFLAGS (-DOPERATION_FILENAME) 中声明一个定义。

为此,我需要动态获取 Android NDK 交叉编译器的当前目标文件的名称,并将其用于定义值。

我找不到有关如何执行此操作的任何信息,并且 Makefile 方式 (CFLAGS += -DOPERATION_echo $* | sed 's/_$$//') 不适用于此处。

我当前的 Android.mk 如下所示:

LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_ARM_MODE := arm

LOCAL_MODULE := libmpn

LOCAL_SRC_FILES := \
<cut>

LOCAL_CFLAGS := \
-std=gnu99 \
-DHAVE_CONFIG_H \
-D__GMP_WITHIN_GMP \
-O2 \
-pedantic \
-fomit-frame-pointer \
-mfloat-abi=softfp \
-DOPERATION_`echo $* | sed 's/_$$//'`

include $(BUILD_SHARED_LIBRARY)

有谁知道在 Android.mk 中获取当前交叉编译器目标的文件名的有效方法?谢谢!

【问题讨论】:

    标签: android c makefile android-ndk android.mk


    【解决方案1】:

    Android.mk 的开头,添加重新定义 get-src-file-target-cflags 的行,如下所示:

    get-src-file-target-cflags = $(LOCAL_SRC_FILES_TARGET_CFLAGS.$1) -DOPERATION_$(basename $1)
    
    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    LOCAL_SRC_FILES := t.cpp qq.c
    LOCAL_MODULE := tm
    LOCAL_LDLIBS := -latomic
    
    include $(BUILD_SHARED_LIBRARY)
    

    如果您愿意,可以将此行放在 Application.mk 中。

    【讨论】:

    • 这不会破坏基于 Windows 的 NDK 构建吗?
    • @gladed 我不知道为什么这在 Windows 上会有所不同。但这种 hack 取决于可能在新版本的 NDK 中破坏的实现细节。
    • basename 在 Windows 中不可用(除非您在 Cygwin 中构建)。
    • 为标志选择 $basename 是一个暂时的实现细节。编写一个正则表达式来模拟 basename 有多难?每个文件的 CFLAGS 应该不同的想法很重要。
    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2023-03-04
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多