对“__android_log_print”的未定义引用
undefined reference to '__android_log_print'
我已经在模拟器上编译 运行 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 吗?感谢您的帮助。
此致,
I also created android.mk in the dex2oat folder
这不起作用。在 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 := ...
或 link 添加源文件,而不是使用 LOCAL_SHARED_LIBRARIES := ...
.[= 的共享库30=]
在您发布的代码中,您给出了 LOCAL_SHARED_LIBRARIES
声明,但我没有看到围绕它的模块声明。所以构建系统无法知道哪个模块想要 link 反对 liblog
。因此,当您想要针对 liblog 声明一个新模块 linking 时,您必须确保您的 LOCAL_SHARED_LIBRARIES
介于 include $(CLEAR_VARS)
和 LOCAL_MODULE := ...
/ include $(BUILD_EXECUTABLE)
(或其他模块类型,以防您要构建静态或共享库)。
但是,这仅适用于您要创建新模块的情况。据我了解,您实际上并不想创建一个新模块,而是向现有模块添加 linker 依赖项,即 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
列表中,添加你想要 link 反对的库,所以在你的情况下,"liblog"
.
我已经在模拟器上编译 运行 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 吗?感谢您的帮助。
此致,
I also created android.mk in the dex2oat folder
这不起作用。在 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 := ...
或 link 添加源文件,而不是使用 LOCAL_SHARED_LIBRARIES := ...
.[= 的共享库30=]
在您发布的代码中,您给出了 LOCAL_SHARED_LIBRARIES
声明,但我没有看到围绕它的模块声明。所以构建系统无法知道哪个模块想要 link 反对 liblog
。因此,当您想要针对 liblog 声明一个新模块 linking 时,您必须确保您的 LOCAL_SHARED_LIBRARIES
介于 include $(CLEAR_VARS)
和 LOCAL_MODULE := ...
/ include $(BUILD_EXECUTABLE)
(或其他模块类型,以防您要构建静态或共享库)。
但是,这仅适用于您要创建新模块的情况。据我了解,您实际上并不想创建一个新模块,而是向现有模块添加 linker 依赖项,即 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
列表中,添加你想要 link 反对的库,所以在你的情况下,"liblog"
.