Я пытаюсь скомпилировать для 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
Я подозреваю, что загруженные библиотеки могут быть несовместимы. Но чем их заменить? Или построить их вручную - но как? Любой совет?
Я сделал, как вы сказали, и вы догадываетесь, что это здорово! Оно работает!
Я узнал проблему с порядком ссылок из вывода. Но я сказал «угадай» просто потому, что я не очень хорошо знаком с cmake
, поэтому я не был уверен, что изменение target_link_libraries
сработает. Подробнее о проблеме порядка см. в моем ответе: gcc ld: метод определения порядка ссылок статических библиотек
Ваша команда ссылки:
arm-linux-gnueabihf-gcc ... libz.a libminizip.a ...
неверно: поскольку libminzip.a
требует символов из libz.a
, он должен быть перед libz.a
в строке ссылки.
Чтобы лучше понять это, прочитайте этот пост.
Просто предположение... Попробуйте изменить порядок утверждений
target_link_libraries
на противоположный. Я предполагаю, чтоMINIZIP_LIBRARY
хочет вызывать вещи вZLIB_LIBRARY
, ноZLIB_LIBRARY
стоит первым в [сгенерированной] команде компоновщика. компоновщики делают один проход через аргументы.a
, поэтому, когда он видит minizip.a
, уже слишком поздно извлекать данные из файла zlib.a
. Возможно, вам также придется изменить порядок ссылокlibjansson.a
.