[Запись об ошибке] Запись об устранении неполадок Android NDK (ошибка: неопределенная ссылка на | Сбой при связывании общей библиотеки CXX)
[Запись об ошибке] Запись об устранении неполадок Android NDK (ошибка: неопределенная ссылка на | Сбой при связывании общей библиотеки CXX)

Предложение

1. Сообщение об ошибке


Сообщение об ошибке:

Язык кода:javascript
копировать
Build command failed.
Error while executing process Y:\001_DevelopTools\002_Android_SDK\cmake\3.6.4111459\bin\cmake.exe with arguments {--build Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\.externalNativeBuild\cmake\debug\armeabi-v7a --target native-lib}
[1/9] Building C object librtmp/CMakeFiles/rtmp.dir/parseurl.c.o
[2/9] Building C object librtmp/CMakeFiles/rtmp.dir/amf.c.o
[3/9] Building C object librtmp/CMakeFiles/rtmp.dir/hashswf.c.o
[4/9] Building C object librtmp/CMakeFiles/rtmp.dir/rtmp.c.o
[5/9] Building C object librtmp/CMakeFiles/rtmp.dir/log.c.o
In file included from Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp\librtmp\amf.c:33:

Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp\librtmp/bytes.h:74:2: warning: "Float word order not defined, assuming the same as byte order!" [-W#warnings]

#warning "Float word order not defined, assuming the same as byte order!"

 ^

1 warning generated.

[6/9] Linking C static library librtmp\librtmp.a
[7/9] Building CXX object CMakeFiles/native-lib.dir/VedioChannel.cpp.o
[8/9] Building CXX object CMakeFiles/native-lib.dir/native-lib.cpp.o
clang++: warning: argument unused during compilation: '-LY:/002_WorkSpace/001_AS/RTMP_Pusher/app/src/main/cpp/libs/armeabi-v7a' [-Wunused-command-line-argument]

clang++: warning: argument unused during compilation: '-LY:/002_WorkSpace/001_AS/RTMP_Pusher/app/src/main/cpp/libs/armeabi-v7a' [-Wunused-command-line-argument]

[9/9] Linking CXX shared library Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\build\intermediates\cmake\debug\obj\armeabi-v7a\libnative-lib.so
FAILED: cmd.exe /C "cd . && Y:\001_DevelopTools\002_Android_SDK\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe  --target=armv7-none-linux-androideabi21 --gcc-toolchain=Y:/001_DevelopTools/002_Android_SDK/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=Y:/001_DevelopTools/002_Android_SDK/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -march=armv7-a -mthumb -Wa,--noexecstack -Wformat -Werror=format-security   -LY:/002_WorkSpace/001_AS/RTMP_Pusher/app/src/main/cpp/libs/armeabi-v7a -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -shared -Wl,-soname,libnative-lib.so -o Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\build\intermediates\cmake\debug\obj\armeabi-v7a\libnative-lib.so CMakeFiles/native-lib.dir/native-lib.cpp.o CMakeFiles/native-lib.dir/VedioChannel.cpp.o  librtmp/librtmp.a -llog -latomic -lm && cd ."
Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp/VedioChannel.cpp:23: error: undefined reference to 'x264_picture_clean'

Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp/VedioChannel.cpp:79: error: undefined reference to 'x264_param_default_preset'

Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp/VedioChannel.cpp:169: error: undefined reference to 'x264_picture_clean'

Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp/VedioChannel.cpp:177: error: undefined reference to 'x264_picture_alloc'

Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp/VedioChannel.cpp:182: error: undefined reference to 'x264_encoder_close'

Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp/VedioChannel.cpp:186: error: undefined reference to 'x264_encoder_open_157'

Y:\002_WorkSpace\001_AS\RTMP_Pusher\app\src\main\cpp/VedioChannel.cpp:248: error: undefined reference to 'x264_encoder_encode'

clang++: error: linker command failed with exit code 1 (use -v to see invocation)

ninja: build stopped: subcommand failed.

2. Анализ ошибок


CMakeList.txt Скрипт сборки следующий : Следуйте этому сценарию сборки , Проверьте шаг за шагом ;

Язык кода:javascript
копировать
cmake_minimum_required(VERSION 3.4.1)

# Связь src/main/cpp/librtmp в каталоге Строить Скрипт
add_subdirectory(librtmp)

add_library( # функция Библиотекаимя
             native-lib

             # Тип динамической библиотеки
             SHARED

             # исходный файл
             native-lib.cpp
             VedioChannel.cpp)

find_library( # бревно Библиотека              log-lib

              log )

# Установить путь поиска файла заголовка
include_directories(include)

# Установив опцию компилировать, Установите путь поиска для функции Библиотека.
# Вот ANDROID_ABI находится в
# build.gradle android->defaultConfig->externalNativeBuild->cmake
# вниз abiFilters серединанастраивать
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}")

target_link_libraries( # Связьдинамичный Библиотека
                       native-lib

                       # компилироватьиз rtmp статический Библиотека                       rtmp

                       ${log-lib} )

Когда код NDK скомпилирован, он выполняется.

9

шаги, шаги 1 ~ 6:

При запуске сборки укажите первую строку содержимого сценария компиляции add_subdirectory(librtmp) и скомпилируйте содержимое CMakeList.txt в каталог librtmp;

Язык кода:javascript
копировать
# Связь src/main/cpp/librtmp в каталоге Строить Скрипт
add_subdirectory(librtmp)

Компиляция исходного кода RTMP. На этом этапе выполняется следующий сценарий сборки и компилируется библиотека librtmp.so, которая соответствует следующему содержимому сценария.

Язык кода:javascript
копировать
cmake_minimum_required(VERSION 3.4.1)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNO_CRYPTO")

add_library( # Название Библиотеки для компилирования: rtmp
             rtmp

             # компилироватьиз rtmp Библиотекастатичен Библиотека             STATIC

             # rtmp Библиотекаизисходный файл
             amf.c
             hashswf.c
             log.c
             parseurl.c
             rtmp.c )

Нет.

7 , 8

Шаг 1. Скомпилируйте исходный код VedioChannel.cpp, скомпилируйте исходный код Native-lib.cpp и соответствующим образом скомпилируйте библиотеку функций libnative-lib.so;

Язык кода:javascript
копировать
add_library( # функция Библиотекаимя
             native-lib

             # Тип динамической библиотеки
             SHARED

             # исходный файл
             native-lib.cpp
             VedioChannel.cpp)

Нет.

9

Шаг: свяжите библиотеку функций. На этом этапе произошла ошибка связи, функция в библиотеке с открытым исходным кодом x264 не найдена;

x264 Процесс компиляции библиотеки с открытым исходным кодом : x264 Заголовочные файлы библиотеки с открытым исходным кодом помещаются в include в каталоге , Кросс-скомпилированная библиотека функций помещается в libs/armeabi-v7a в каталоге ;

Язык кода:javascript
копировать
# Установить путь поиска файла заголовка
include_directories(include)

# Установив опцию компилировать, Установите путь поиска для функции Библиотека.
# Вот ANDROID_ABI находится в
# build.gradle android->defaultConfig->externalNativeBuild->cmake
# вниз abiFilters серединанастраивать
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}")

Библиотека с открытым исходным кодом x264 должна быть скомпилирована и передана. При связывании x264 не связывается с собственной библиотекой, что приводит к невозможности доступа к функциям библиотеки с открытым исходным кодом x264;

Язык кода:javascript
копировать
target_link_libraries( # Связьдинамичный Библиотека
                       native-lib

                       # компилироватьиз rtmp статический Библиотека                       rtmp

                       ${log-lib} )

Метод модификации : При подключении библиотеки , Воля x264 Библиотека добавлена ;

Язык кода:javascript
копировать
target_link_libraries( # Связьдинамичный Библиотека
                       native-lib

                       # компилироватьиз rtmp статический Библиотека                       rtmp
                       # предварительнокомпилироватьиз x264 статический Библиотека                       x264

                       ${log-lib} )

Окончательный модифицированный сценарий сборки (правильный сценарий сборки):

Язык кода:javascript
копировать
cmake_minimum_required(VERSION 3.4.1)

# Связь src/main/cpp/librtmp в каталоге Строить Скрипт
add_subdirectory(librtmp)

add_library( # функция Библиотекаимя
             native-lib

             # Тип динамической библиотеки
             SHARED

             # исходный файл
             native-lib.cpp
             VedioChannel.cpp)

find_library( # бревно Библиотека              log-lib

              log )

# Установить путь поиска файла заголовка
include_directories(include)

# Установив опцию компилировать, Установите путь поиска для функции Библиотека.
# Вот ANDROID_ABI находится в
# build.gradle android->defaultConfig->externalNativeBuild->cmake
# вниз abiFilters серединанастраивать
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}")

target_link_libraries( # Связьдинамичный Библиотека
                       native-lib

                       # компилироватьиз rtmp статический Библиотека                       rtmp
                       # предварительнокомпилироватьиз x264 статический Библиотека                       x264

                       ${log-lib} )

3. Сводка ошибок

Сводка ошибок : встретиться Linking CXX shared library Шаг не выполнен , и подскажи error: undefined reference to функция не может быть найдена , На этапе связывания произошла ошибка , Исправлять CMakeList.txt в target_link_libraries параметры ссылки ;

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose