Сообщение об ошибке при компиляции ARM на C: неопределенная ссылка на «crc32»

Я пытаюсь скомпилировать для ARM 32-битный проект C, который содержит ссылки на статические библиотеки zlib и minizip. Я работаю с CLion IDE на Ubuntu 20. У меня был установлен набор инструментов:

sudo apt-get install gcc-arm-linux-gnueabihf

Затем я скачал deb-пакеты ARM, из которых извлек libz.a и libminizip.a:

zlib1g-dev_1.2.11.dfsg-2ubuntu1_armhf.deb
libminizip-dev_1.1-8build1_armhf.deb

Затем я пытаюсь скомпилировать, но имею:

====================[ Build | all | Default-System ]============================
/home/user/external/clion-2023.1.1/bin/cmake/linux/x64/bin/cmake --build /home/user/Clion/myproject/cmake-build-default-system --target all -j 1
[3/3] Linking C executable updater
FAILED: updater 
: && /usr/bin/arm-linux-gnueabihf-gcc -fsanitize=address  CMakeFiles/updater.dir/main.c.o CMakeFiles/updater.dir/base64.c.o -o updater  /home/user/Clion/myproject/lib/arm/libz.a  /home/user/Clion/myproject/lib/arm/libminizip.a  /home/user/Clion/myproject/lib/arm/libjansson.a && :
/usr/lib/gcc-cross/arm-linux-gnueabihf/9/../../../../arm-linux-gnueabihf/bin/ld: /home/user/Clion/myproject/lib/arm/libminizip.a(unzip.o): in function «unzReadCurrentFile»:
(.text+0x144e): undefined link to «crc32»

Вот CmakeLists.txt:

cmake_minimum_required(VERSION 3.17)
project(updater C)

set(CMAKE_C_STANDARD 99)

add_executable(updater main.c unpack.h)


set(ZLIB_INCLUDE_DIR /home/user/Clion/myproject/zlib-arm/include)
set(ZLIB_LIBRARY /home/user/Clion/myproject/lib/arm/libz.a)
set(MINIZIP_LIBRARY /home/user/Clion/myproject/lib/arm/libminizip.a)
target_include_directories(updater PRIVATE ${ZLIB_INCLUDE_DIR})
target_link_libraries(updater PRIVATE ${ZLIB_LIBRARY})
target_link_libraries(updater PRIVATE ${MINIZIP_LIBRARY})

Обзор libz.a выглядит нормально:

nm /home/user/Clion/myproject/lib/arm/libz.a | grep crc32
crc32.o:
00000645 T crc32
0000064d T crc32_combine
00000481 t crc32_combine_
00000651 T crc32_combine64
00000001 t crc32_little
0000063d T crc32_z
         U crc32
         U crc32

Я подозреваю, что загруженные библиотеки могут быть несовместимы. Но чем их заменить? Или построить их вручную - но как? Любой совет?

Просто предположение... Попробуйте изменить порядок утверждений target_link_libraries на противоположный. Я предполагаю, что MINIZIP_LIBRARY хочет вызывать вещи в ZLIB_LIBRARY, но ZLIB_LIBRARY стоит первым в [сгенерированной] команде компоновщика. компоновщики делают один проход через аргументы .a, поэтому, когда он видит minizip .a, уже слишком поздно извлекать данные из файла zlib .a. Возможно, вам также придется изменить порядок ссылок libjansson.a.

Craig Estey 11.04.2023 03:47

Я сделал, как вы сказали, и вы догадываетесь, что это здорово! Оно работает!

Олег Сидоров 11.04.2023 19:55

Я узнал проблему с порядком ссылок из вывода. Но я сказал «угадай» просто потому, что я не очень хорошо знаком с cmake, поэтому я не был уверен, что изменение target_link_libraries сработает. Подробнее о проблеме порядка см. в моем ответе: gcc ld: метод определения порядка ссылок статических библиотек

Craig Estey 11.04.2023 23:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша команда ссылки:

arm-linux-gnueabihf-gcc ... libz.a libminizip.a ...

неверно: поскольку libminzip.a требует символов из libz.a, он должен быть перед libz.a в строке ссылки.

Чтобы лучше понять это, прочитайте этот пост.

Другие вопросы по теме