AOSP - ошибка: неопределенная ссылка на во время сборки - PullRequest
2 голосов
/ 25 апреля 2020

Мне нужен другой человек с хорошими глазами, чтобы сказать мне, что я здесь делаю неправильно.

Мне пришлось обновить загрузчик U-boot на моих устройствах, и, естественно, мне приходилось что-то делать подходит снова. Но в настоящее время я не могу заставить свою систему AOSP строить так, как раньше. Я начну с сообщений об ошибках и запишу свой мыслительный процесс:

target Symbolic: fw_printenv (out/target/product/board/symbols/system/bin/fw_printenv)
target Strip: fw_printenv (out/target/product/board/obj/EXECUTABLES/fw_printenv_intermediates/fw_printenv)
Install: out/target/product/board/system/bin/fw_printenv
target Executable: test_executer (out/target/product/board/obj/EXECUTABLES/test_executer_intermediates/LINKED/test_executer)
external/utils/production/set_display_orientation.cpp:81: error: undefined reference to 'fw_printenv(int, char**, int, env_opts*)'
external/utils/production/set_display_orientation.cpp:57: error: undefined reference to 'fw_setenv(int, char**, env_opts*)'
external/utils/production/set_display_orientation.cpp:65: error: undefined reference to 'fw_printenv(int, char**, int, env_opts*)'
collect2: error: ld returned 1 exit status

Итак, ошибка компоновщика. И мой код не может найти функции, определенные в другом модуле. Итак, давайте посмотрим на файл Android .mk , отвечающий за set_display_orientation. cpp.

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := test_executer
LOCAL_SRC_FILES := test_executer.cpp \
        TestSequences.cpp \
        buzzer_test.cpp \
        rtc_test.cpp \
        AudioTests.cpp \
        rs485_test.cpp \
        rs232.cpp \
        set_display_orientation.cpp \
        gpio.cpp \
        gpio_helper.c \
        ping.cpp \
        usb.cpp \
        mmc.cpp \
        display.cpp \
        touchscreen.cpp \
        productionSector.cpp \
        psoc_uart3.cpp \
        ../../tslib/tests/fbutils.c

LOCAL_MODULE_TAGS := optional

LOCAL_STATIC_LIBRARIES += libfw libeeprom libpsoc_helper

LOCAL_SHARED_LIBRARIES += libts libc libcutils

LOCAL_C_INCLUDES += bootable/bootloader/uboot-imx/tools/env \
                    external/tslib \
                    external/tslib/tests \
                    external/tslib/src \
                    external/utils/eeprom \
                    external/utils/PSoCUpdate
ifneq ($(PTEST_VERSION),)
LOCAL_CFLAGS := -DPTEST_VERSION=$(PTEST_VERSION)
endif


LOCAL_CFLAGS += -DUSE_HOSTCC \
                -DANDROID \
                -isystem bootable/bootloader/uboot-imx/include/ \
                -isystem bootable/bootloader/uboot-imx/arch/arm/include/

include $(BUILD_EXECUTABLE)

Теперь в сообщениях об ошибках говорится, что существует неопределенная ссылка на fw_printenv (), fw_setenv () и fw_printenv () . Но эти функции определены в boottable / bootloader / uboot-imx / tools / env , которые включены в LOCAL_C_INCLUDES += bootable/bootloader/uboot-imx/tools/env и являются частью LOCAL_STATIC_LIBRARIES += libfw. Для полноты картины я также включу файл Android .mk , отвечающий за libfw , который является частью U-Boot.

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

LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := fw_printenv

LOCAL_SRC_FILES :=  fw_env_main.c

LOCAL_C_INCLUDES += fw_env.h
LOCAL_STATIC_LIBRARIES := libfw

LOCAL_CFLAGS := -DUSE_HOSTCC \
                -DANDROID \
                -isystem$(LOCAL_PATH)/../../include/ \
                -isystem$(LOCAL_PATH)/../../arch/arm/include/


include $(BUILD_EXECUTABLE)

include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE:= libfw


LOCAL_SRC_FILES :=  fw_env.c \
                    ctype.c \
                    crc32.c \
                    env_attr.c \
                    env_flags.c \
                    aes.c
#since alot of duplicated Header files exist in uboot-imx/include/ we use -isystem here
#to search for the correct Headers in bionic first
LOCAL_CFLAGS := -DUSE_HOSTCC \
                -DANDROID \
                -isystem$(LOCAL_PATH)/../../include/ \
                -isystem$(LOCAL_PATH)/../../arch/arm/include/

LOCAL_C_INCLUDES += fw_env.h \
                    external/mtd-utils/new-utils/include/

include $(BUILD_STATIC_LIBRARY)

Может кто-то пожалуйста, укажите, где я здесь не так. Я просмотрел онлайн-документацию (https://developer.android.com/ndk/guides/android_mk), а также переполнение стека. Я действительно потерян на этом.

1 Ответ

2 голосов
/ 25 апреля 2020

Как видно из Android.mk для libfw, это C -библиотека, тогда как ваш код на C ++. C и C ++ имеют разные ABI, поэтому компоновщик не может сопоставить функции, которые вы вызываете в своем коде C ++, с функциями, определенными в библиотеке C. Чтобы предотвратить эту проблему, включите заголовки, используя:

extern "C" {
#include "header_from_libfw.h"
}

Это даст указание компилятору C ++ использовать C -ABI для функций, определенных в этом заголовке, чтобы их можно было сопоставить с определенными функциями. в C -библиотеке при связывании. В частности, это отключает манипулирование именами в стиле C ++ ( ссылка ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...