Вопрос или проблема
Я пытаюсь кросс-компилировать libzip-1.5.1, ранее успешно скомпилировав zlib-1.2.11 (которые требуются для libzip и установлены в локальном пути), но я сталкиваюсь с проблемами в процессе cmake.
Скрипт, который я использую для сборки и компиляции (из каталога сборки в папку источников libzip), выглядит следующим образом:
#!/bin/sh
PREFIX=${PWD}/install
CCPATH=/opt/arm64/gcc-linaro-6.3.1-2017.02-rc2-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf
ZLIBPATH=${PWD}/../../zlib-1.2.11/
# здесь zlib установлен
# ZLIBINSTALLEDPATH содержит директории include, lib, share
ZLIBINSTALLEDPATH=${ZLIBPATH}/build_armhf64/install/
export PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:${ZLIBINSTALLEDPATH}/lib/pkgconfig/"
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${ZLIBINSTALLEDPATH}/lib/"
export CMAKE_AR=${CCPATH}-ar
export CC=${CCPATH}-gcc
export CXX=${CCPATH}-g++
export CMAKE_LINKER=${CCPATH}-ld
export CMAKE_RANLIB=${CCPATH}-ranlib
export CMAKE_OBJDUMP=${CCPATH}-objdump
export CMAKE_OBJCOPY=${CCPATH}-objcopy
export CMAKE_STRIP=${CCPATH}-strip
#export CMAKE_READELF=${CCPREFIX}-readelf
export CMAKE_NM=${CCPATH}-nm
cmake -DCMAKE_INSTALL_PREFIX=${PREFIX} \
-DZLIB_INCLUDE_DIR=${ZLIBINSTALLEDPATH}/include/ \
-DZLIB_LIBRARY=${ZLIBINSTALLEDPATH}/lib/ \
../
make -j 8
Но на 94% процесса сборки я получаю следующие ошибки:
[ 92%] Building C object regress/CMakeFiles/tryopen.dir/tryopen.c.o
[ 94%] Building C object src/CMakeFiles/zipcmp.dir/zipcmp.c.o
[ 94%] Linking C executable add_from_filep
[ 94%] Linking C executable fopen_unchanged
[ 94%] Linking C executable tryopen
[ 94%] Building C object regress/CMakeFiles/hole.dir/source_hole.c.o
[ 94%] Linking C executable zipmerge
../lib/libzip.so.5.0: undefined reference to `inflate'
../lib/libzip.so.5.0: undefined reference to `crc32'
../lib/libzip.so.5.0: undefined reference to `zError'
../lib/libzip.so.5.0: undefined reference to `deflate'
../lib/libzip.so.5.0: undefined reference to `deflateInit2_'
../lib/libzip.so.5.0: undefined reference to `inflateEnd'
../lib/libzip.so.5.0: undefined reference to `deflateEnd'
../lib/libzip.so.5.0: undefined reference to `inflateInit2_'
collect2: error: ld returned 1 exit status
regress/CMakeFiles/add_from_filep.dir/build.make:95: recipe for target 'regress/add_from_filep' failed
make[2]: *** [regress/add_from_filep] Error 1
CMakeFiles/Makefile2:726: recipe for target 'regress/CMakeFiles/add_from_filep.dir/all' failed
make[1]: *** [regress/CMakeFiles/add_from_filep.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
../lib/libzip.so.5.0: undefined reference to `inflate'
../lib/libzip.so.5.0: undefined reference to `crc32'
../lib/libzip.so.5.0: undefined reference to `zError'
../lib/libzip.so.5.0: undefined reference to `deflate'
../lib/libzip.so.5.0: undefined reference to `deflateInit2_'
../lib/libzip.so.5.0: undefined reference to `inflateEnd'
../lib/libzip.so.5.0: undefined reference to `deflateEnd'
../lib/libzip.so.5.0: undefined reference to `inflateInit2_'
collect2: error: ld returned 1 exit status
regress/CMakeFiles/tryopen.dir/build.make:95: recipe for target 'regress/tryopen' failed
make[2]: *** [regress/tryopen] Error 1
CMakeFiles/Makefile2:800: recipe for target 'regress/CMakeFiles/tryopen.dir/all' failed
make[1]: *** [regress/CMakeFiles/tryopen.dir/all] Error 2
../lib/libzip.so.5.0: undefined reference to `inflate'
../lib/libzip.so.5.0: undefined reference to `crc32'
../lib/libzip.so.5.0: undefined reference to `zError'
../lib/libzip.so.5.0: undefined reference to `deflate'
../lib/libzip.so.5.0: undefined reference to `deflateInit2_'
../lib/libzip.so.5.0: undefined reference to `inflateEnd'
../lib/libzip.so.5.0: undefined reference to `deflateEnd'
../lib/libzip.so.5.0: undefined reference to `inflateInit2_'
collect2: error: ld returned 1 exit status
regress/CMakeFiles/fopen_unchanged.dir/build.make:95: recipe for target 'regress/fopen_unchanged' failed
make[2]: *** [regress/fopen_unchanged] Error 1
CMakeFiles/Makefile2:615: recipe for target 'regress/CMakeFiles/fopen_unchanged.dir/all' failed
make[1]: *** [regress/CMakeFiles/fopen_unchanged.dir/all] Error 2
[ 94%] Building C object regress/CMakeFiles/ziptool_regress.dir/source_hole.c.o
../lib/libzip.so.5.0: undefined reference to `inflate'
../lib/libzip.so.5.0: undefined reference to `crc32'
../lib/libzip.so.5.0: undefined reference to `zError'
../lib/libzip.so.5.0: undefined reference to `deflate'
../lib/libzip.so.5.0: undefined reference to `deflateInit2_'
../lib/libzip.so.5.0: undefined reference to `inflateEnd'
../lib/libzip.so.5.0: undefined reference to `deflateEnd'
../lib/libzip.so.5.0: undefined reference to `inflateInit2_'
collect2: error: ld returned 1 exit status
src/CMakeFiles/zipmerge.dir/build.make:95: recipe for target 'src/zipmerge' failed
make[2]: *** [src/zipmerge] Error 1
CMakeFiles/Makefile2:432: recipe for target 'src/CMakeFiles/zipmerge.dir/all' failed
make[1]: *** [src/CMakeFiles/zipmerge.dir/all] Error 2
[ 94%] Linking C executable zipcmp
[ 94%] Linking C executable ziptool
[ 96%] Linking C executable hole
CMakeFiles/zipcmp.dir/zipcmp.c.o.:. /Inlib /functionlibzip.so.5.0 :` compute_crcundefined' :reference
zipcmp.cto: (`.inflatetext'+
0x4a0.).:/ libundefined/ libzip.so.5.0reference: toundefined `referencecrc32 'to
zipcmp.c`:crc32('.
text.+.0x53e/)lib:/ libzip.so.5.0undefined: referenceundefined toreference `tocrc32 '`
zErrorCMakeFiles'/
zipcmp.dir./.zipcmp.c.o/:lib /Inlibzip.so.5.0 :function undefined` test_filereference':
zipcmp.cto: (`.deflatetext'+
0x1494.).:/ libundefined/ libzip.so.5.0reference: toundefined `referencecrc32'
zipcmp.c:(.text+0x14fe): undefined reference to `crc32'
.. /tolib /`libzip.so.5.0deflateInit2_:'
undefined. .reference/ libto/ libzip.so.5.0`:inflate 'undefined
.reference. /tolib /`libzip.so.5.0inflateEnd:'
undefined. .reference/ libto/ libzip.so.5.0`:zError 'undefined
.reference. /tolib /`libzip.so.5.0deflateEnd:' undefined reference to `deflate'
.
../.lib//liblibzip.so.5.0/:libzip.so.5.0 :undefined undefinedreference referenceto to` deflateInit2_`'inflateInit2_
'.
./lib/libzip.so.5.0: undefined reference to `inflateEnd'
../lib/libzip.so.5.0: undefined reference to `deflateEnd'
../lib/libzip.so.5.0: undefined reference to `inflateInit2_'
collect2: error: ld returned 1 exit status
src/CMakeFiles/ziptool.dir/build.make:95: recipe for target 'src/ziptool' failed
make[2]: *** [src/ziptool] Error 1
src/CMakeFiles/zipcmp.dir/build.make:95: recipe for target 'src/zipcmp' failed
make[2]: *** [src/zipcmp] Error 1
CMakeFiles/Makefile2:469: recipe for target 'src/CMakeFiles/ziptool.dir/all' failed
make[1]: *** [src/CMakeFiles/ziptool.dir/all] Error 2
CMakeFiles/Makefile2:395: recipe for target 'src/CMakeFiles/zipcmp.dir/all' failed
make[1]: *** [src/CMakeFiles/zipcmp.dir/all] Error 2
../lib/libzip.so.5.0: undefined reference to `inflate'
../lib/libzip.so.5.0: undefined reference to `crc32'
../lib/libzip.so.5.0: undefined reference to `zError'
../lib/libzip.so.5.0: undefined reference to `deflate'
../lib/libzip.so.5.0: undefined reference to `deflateInit2_'
../lib/libzip.so.5.0: undefined reference to `inflateEnd'
../lib/libzip.so.5.0: undefined reference to `deflateEnd'
../lib/libzip.so.5.0: undefined reference to `inflateInit2_'
collect2: error: ld returned 1 exit status
[ 98%] Linking C executable ziptool_regress
regress/CMakeFiles/hole.dir/build.make:121: recipe for target 'regress/hole' failed
make[2]: *** [regress/hole] Error 1
CMakeFiles/Makefile2:652: recipe for target 'regress/CMakeFiles/hole.dir/all' failed
make[1]: *** [regress/CMakeFiles/hole.dir/all] Error 2
../lib/libzip.so.5.0: undefined reference to `inflate'
../lib/libzip.so.5.0: undefined reference to `crc32'
../lib/libzip.so.5.0: undefined reference to `zError'
../lib/libzip.so.5.0: undefined reference to `deflate'
../lib/libzip.so.5.0: undefined reference to `deflateInit2_'
../lib/libzip.so.5.0: undefined reference to `inflateEnd'
../lib/libzip.so.5.0: undefined reference to `deflateEnd'
../lib/libzip.so.5.0: undefined reference to `inflateInit2_'
collect2: error: ld returned 1 exit status
regress/CMakeFiles/ziptool_regress.dir/build.make:121: recipe for target 'regress/ziptool_regress' failed
make[2]: *** [regress/ziptool_regress] Error 1
CMakeFiles/Makefile2:689: recipe for target 'regress/CMakeFiles/ziptool_regress.dir/all' failed
make[1]: *** [regress/CMakeFiles/ziptool_regress.dir/all] Error 2
Makefile:138: recipe for target 'all' failed
make: *** [all] Error 2
Кажется, что cmake не может найти скомпилированные библиотеки zlib, даже если пути, похоже, настроены правильно (или нет?).
Кто-нибудь сталкивался с подобными проблемами с libzip?
Есть ли какие-то дополнительные макросы cmake, которые могли бы решить эту проблему?
—- ОБНОВЛЕНИЕ —-
Я на самом деле избавился от этой ошибки, исключив задачи сборки для zipcmp, zipmerge и ziptool (так как они мне не нужны), комментируя строки:
#ADD_EXECUTABLE(zipcmp zipcmp.c ${SRC_EXTRA_FILES})
#TARGET_LINK_LIBRARIES(zipcmp zip)
#INSTALL(TARGETS zipcmp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
#ADD_EXECUTABLE(zipmerge zipmerge.c ${SRC_EXTRA_FILES})
#TARGET_LINK_LIBRARIES(zipmerge zip)
#INSTALL(TARGETS zipmerge RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
#ADD_EXECUTABLE(ziptool ziptool.c ${SRC_EXTRA_FILES})
#TARGET_LINK_LIBRARIES(ziptool zip)
#INSTALL(TARGETS ziptool RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
в src/CMakeLists.txt
.
Затем я скомпилировал библиотеки, используя make -j 8 zip
, и затем make install/fast
.
Он все еще возвращает ошибку
Установка проекта...
-- Установка конфигурации: ""
-- Установка: /home/simo/adtdev/Var_libs/libzip-1.5.1/build_armhf64/install/lib/pkgconfig/libzip.pc
-- Установка: /home/simo/adtdev/Var_libs/libzip-1.5.1/build_armhf64/install/include/zipconf.h
-- Установка: /home/simo/adtdev/Var_libs/libzip-1.5.1/build_armhf64/install/include/zip.h
-- Установка: /home/simo/adtdev/Var_libs/libzip-1.5.1/build_armhf64/install/lib/libzip.a
CMake Error at man/cmake_install.cmake:36 (file):
file INSTALL cannot find
"/home/simo/adtdev/Var_libs/libzip-1.5.1/build_armhf64/man/ZIP_SOURCE_GET_ARGS.3".
Call Stack (most recent call first):
cmake_install.cmake:46 (include)
Makefile:89: recipe for target 'install/fast' failed
make: *** [install/fast] Error 1
но меня это не волнует, так как библиотеки и заголовки установлены в директорию install, и это то, что мне нужно.
# это важно
SET(CMAKE_SYSTEM_NAME Linux)
# это не так важно
SET(CMAKE_SYSTEM_VERSION 1)
# указываем кросс-компилятор
SET(CMAKE_C_COMPILER /your/toolchain/path/bin/yourcompile-gcc)
SET(CMAKE_CXX_COMPILER /your/toolchain/path/bin/yourcompile-g++)
# где находится целевая среда
SET(CMAKE_FIND_ROOT_PATH /your/rootfs/path)
# поиск программ в директориях хоста сборки
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# для библиотек и заголовков в целевых директориях
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Ответ или решение
Вопрос о кросс-компиляции библиотеки libzip версии 1.5.1 для Linux может показаться сложным из-за множества деталей, связанных с настройкой конфигурации CMake и работы с зависящими библиотеками, такими как zlib. Ваша проблема связана с отсутствием ссылок на функции zlib, что указывает на неправильную конфигурацию путей или порядка компоновки библиотек. Постараемся разобраться в теоретических основах, приведем пример и предложим решение.
Теория
Во время кросс-компиляции необходимо правильно настроить CMake так, чтобы он мог найти и использовать нужные библиотеки и инструменты. Основные настройки включают пути к заголовочным файлам и библиотекам, а также компиляторы. Также важно определить порядок, в котором библиотеки линкуются, так как это влияет на успешность компиляции.
Пример
-
Установка переменных окружения: Убедитесь, что переменные
PKG_CONFIG_PATH
иLD_LIBRARY_PATH
указывают на корректные каталоги, где лежат скомпилированные библиотеки zlib. -
Настройка CMake: Используйте опции
CMAKE_FIND_ROOT_PATH_MODE_LIBRARY
иCMAKE_FIND_ROOT_PATH_MODE_INCLUDE
для указания, что поиск библиотек и заголовков должен происходить только в целевой системе.
Пример дополненной конфигурации CMake:
cmake -DCMAKE_INSTALL_PREFIX=${PREFIX} \
-DZLIB_INCLUDE_DIR=${ZLIBINSTALLEDPATH}/include/ \
-DZLIB_LIBRARY=${ZLIBINSTALLEDPATH}/lib/libz.so \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_VERSION=1 \
-DCMAKE_C_COMPILER=${CCPATH}-gcc \
-DCMAKE_CXX_COMPILER=${CCPATH}-g++ \
-DCMAKE_FIND_ROOT_PATH=${ZLIBINSTALLEDPATH} \
-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \
../
Применение
-
Проверка путей: Убедитесь, что переменная
ZLIB_LIBRARY
указывает непосредственно на файл.so
или.a
библиотеки zlib. Это критично при использовании CMake, так как она должна знать, какую библиотеку брать для компоновки. -
Включение дополнительных флагов компоновки: Если проблема не решается, попробуйте явно добавить пути к zlib в команду компиляции, например, через
CFLAGS
иLDFLAGS
. -
Настройка обязательных программ и библиотек: Убедитесь, что компиляторы и утилиты (ар, ранлиб и т.п.) корректно установлены и доступны.
Заключение: Удостоверившись, что все пути правильно настроены и библиотеки доступны для CMake, у вас не должно возникнуть проблем с ошибками undefined reference. Если вы не используете часть функционала (как zipcmp, zipmerge, ziptool), логично исключить эти цели из сборки, если они не нужны.