【问题标题】:undefined reference to '__android_log_print'未定义对“__android_log_print”的引用
【发布时间】:2020-07-27 06:14:48
【问题描述】:

我已经在模拟器上编译并运行了 Android 8。我想在 AOSP 中安装和打开应用程序时查看 ART 的行为。我在 dex2aot.cc 文件中添加了这一行:

#include <android/log.h>
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-lib", __VA_ARGS__))
#define LOG_TAG "foo"

还有这个LOGI("DOOOOOOOOTOOOOOOOOOOOOOOOO");

~Dex2Oat() {
// Log completion time before deleting the runtime_, because this accesses
// the runtime.

LOGI("DOOOOOOOOTOOOOOOOOOOOOOOOO");

LogCompletionTime();

我还在 dex2aot 文件夹中创建了 android.mk,其中包含:

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

然后我运行这些命令

source build/envsetup.sh
lunch aosp_arm-eng
make -j8

我得到undefined reference 错误。我查找了错误,但大多数解决方案都非常旧。有什么新的解决方案吗?我应该在构建文件夹中修改 android.mk 吗?感谢您的帮助。

问候,

【问题讨论】:

    标签: android makefile android-source android.mk


    【解决方案1】:

    我还在 dex2oat 文件夹中创建了 android.mk

    这不起作用。在 Android.mk 中声明模块的模式是,例如用于创建二进制文件:

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    ...
    LOCAL_MODULE := name_of_your_module
    include $(BUILD_EXECUTABLE)
    

    这定义了一个新模块name_of_your_module,它的类型是可执行文件。然后,您可以填写有关模块的详细信息来代替...,例如,您可以使用LOCAL_SRC_FILES := ... 添加源文件或使用LOCAL_SHARED_LIBRARIES := ... 链接到共享库。

    在您发布的代码中,您给出了LOCAL_SHARED_LIBRARIES 声明,但我没有看到围绕它的模块声明。所以构建系统无法知道哪个模块想要链接到liblog。因此,当您想要声明一个链接 liblog 的新模块时,您必须确保您的 LOCAL_SHARED_LIBRARIES 介于 include $(CLEAR_VARS)LOCAL_MODULE := ... / include $(BUILD_EXECUTABLE) 之间(或其他模块类型,以防万一您想构建一个静态或共享库)。

    但是,这只适用于您要创建新模块的情况。据我了解,您实际上并不想创建新模块,而是向现有模块添加链接器依赖项,即dex2oat。为此,您必须修改dex2oat 的现有模块声明。现在您说您使用的是 Android 8,该模块在 ./art/dex2oat/Android.bp 中声明。为 Android.bp 中声明的现有模块创建新的 Android.mk 将不起作用。相反,您必须修改 Android.bp。

    ./art/dex2oat/Android.bp中,找到dex2oat的模块声明:

    art_cc_binary {
        name: "dex2oat",
        defaults: [
            "dex2oat-defaults",
        ],
        shared_libs: [
            "libart",
            "libart-compiler",
            "libbase",
            "libsigchain",
        ],
    }
    

    shared_libs 列表中,添加您要链接的库,在您的情况下为"liblog"

    【讨论】:

    • 非常感谢您的详细回答。我将 liblog 添加到您提到的 art_cc_binary 中。它没有用。我还将它添加到它下面的另一个 art_cc_binary 并成功编译。希望能在logcat中看到日志。谢谢
    • 好吧,你是对的,你修改的dex2oat.cc文件好像包含在多个模块中。所以使用这个源文件的所有模块都必须链接到 liblog。抱歉,我没有检查其他模块是否在使用此文件。
    • 您的帮助仍然很大。谢谢
    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2022-01-22
    • 2016-04-04
    • 2015-11-03
    • 2011-08-11
    • 2019-07-22
    相关资源
    最近更新 更多