решено - Объяснение в конце поста
Я работаю над проектом и сейчас мне нужно сделать кросс-компиляцию двух пакетов для ARM, библиотеки иприложение, которое зависит от этой библиотеки.
У меня есть один файл .cmake как для библиотеки, так и для приложения, и, похоже, он работает, за исключением того факта, что всякий раз, когда процесс компиляции достигает фазы компоновки, компилятор говорит, что не можетнайдите некоторые библиотеки и затем завершите работу.
Я проверил, и моя система отвечает всем требованиям для сборки этих программ из исходного кода, однако, есть несколько вещей, которые необходимо знать о конфигурации проектов.
Поскольку я кросс-компилирую, все библиотеки, которые мне нужны, должны быть их версиями ARM, что не является проблемой вообще, но я думаю, что предоставление этих библиотек является причиной всех проблем.Я просто догадываюсь здесь, потому что не могу придумать ни одной другой причины, которая могла бы произойти.
Итак, я предоставляю эти библиотеки, используя файл .cmake, который выглядит примерно так:
set( TC_PATH "/usr/bin/" )
set( ROOTFS_PATH "/home/pc/Desktop/projects/rootfs" )
set( CROSS_LOCAL_PREFIX "/usr" )
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CROSS_COMPILE arm-linux-gnueabihf- )
set( CMAKE_C_COMPILER "${TC_PATH}${CROSS_COMPILE}gcc" )
set( CMAKE_CXX_COMPILER "${TC_PATH}${CROSS_COMPILE}g++" )
set( CMAKE_LINKER "${TC_PATH}${CROSS_COMPILE}ld" )
set( CMAKE_AR "${TC_PATH}${CROSS_COMPILE}ar" )
set( CMAKE_OBJCOPY "${TC_PATH}${CROSS_COMPILE}objcopy" )
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
set( CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY )
set( CMAKE_PREFIX_PATH ${ROOTFS_PATH} )
set( CMAKE_INSTALL_PREFIX "${ROOTFS_PATH}${CROSS_LOCAL_PREFIX}" )
set( CMAKE_FIND_ROOT_PATH ${ROOTFS_PATH} )
set( ENV{PKG_CONFIG_PATH} "${ROOTFS_PATH}${CROSS_LOCAL_PREFIX}/lib/pkgconfig/" )
set( ENV{PKG_CONFIG_SYSROOT_DIR} ${ROOTFS_PATH} )
set( CAER_LOCAL_PREFIX ${CROSS_LOCAL_PREFIX} )
set( CAER_LOCAL_INCDIRS "${ROOTFS_PATH}${CROSS_LOCAL_PREFIX}/include/" )
set( CAER_LOCAL_LIBDIRS "${ROOTFS_PATH}/lib/;${ROOTFS_PATH}${CROSS_LOCAL_PREFIX}/lib/" )
Итак, как указано в файле, каталогами, в которых хранятся библиотеки, являются "$ {ROOTFS_PATH} / lib /" и "$ {ROOTFS_PATH} $ {CROSS_LOCAL_PREFIX} / lib /", что в конечном итоге переводится в "/ home / pc / Desktop / projects / rootfs / lib / "и" / home / pc / Desktop / projects / rootfs / usr / lib "соответственно.
Этот путь немного неортодоксален, но именно здесьARM библиотеки находятся на.Причина этого заключается в том, что каталог «rootfs» содержит файловую систему для небольшого дистрибутива Linux, предназначенного для запуска на встроенном оборудовании с использованием SD-карты для хранения, и в нем уже есть все необходимое, кроме этих двух программ.У меня проблемы с компиляцией.
Поскольку каталоги библиотек верны, я ожидал, что компиляция пройдет хорошо, но это не так.Вместо этого я получил более одной ошибки, связанной с библиотеками:
Результаты компиляции:
[ 7%] Linking C shared library libcaer.so
/usr/lib/gcc-cross/arm-linux-gnueabihf/5/../../../../arm-linux-gnueabihf/bin/ld: cannot find /lib/libc.so.6
/usr/lib/gcc-cross/arm-linux-gnueabihf/5/../../../../arm-linux-gnueabihf/bin/ld: cannot find /usr/lib/libc_nonshared.a
/usr/lib/gcc-cross/arm-linux-gnueabihf/5/../../../../arm-linux-gnueabihf/bin/ld: cannot find /lib/ld-linux-armhf.so.3
collect2: error: ld returned 1 exit status
src/CMakeFiles/caer.dir/build.make:248: recipe for target 'src/libcaer.so.3.1.0' failed
make[2]: *** [src/libcaer.so.3.1.0] Error 1
CMakeFiles/Makefile2:135: recipe for target 'src/CMakeFiles/caer.dir/all' failed
make[1]: *** [src/CMakeFiles/caer.dir/all] Error 2
Makefile:151: recipe for target 'all' failed
make: *** [all] Error 2
Однако, и это то, что сводит меня с ума, когда всплывают ошибки, они говорят, что / lib / libc.so.6 или какая-либо другая библиотека отсутствует, но не / home / pc / Desktop / projects / rootfs / usr / lib / что угодно отсутствует.
Исходя из этого, я предполагаю, что библиотеки не ищутся в правильных каталогах, даже если в файле .cmake указаны правильные.
Я успешно построил эти две программыраньше, но единственный раз, когда мне удалось это сделать, мне пришлось скопировать определенные библиотеки, которые не были найдены, в конкретный путь, по которому компилятор сказал мне, что ищет их.
Это означает, что я скопировал "/home / pc / Desktop / projects / rootfs / usr / lib / libc_nonshared.a "в" /usr/lib/libc_nonshared.a "и т. д.
Этот подход неприемлем, поскольку явероятно, придется давать инструкции другим людям, чтобы они сами компилировали приложения, а копирование библиотек, которые уже существуют в каком-то другом месте, только потому, что компилятор «игнорирует» их, просто кажется неправильным.
Итак, это насколько я могу понять, я надеюсь, что кто-то сможет пролить свет на этот вопрос.Заранее большое спасибо.
ОБНОВЛЕНИЕ - РЕШЕНО
Итак, в итоге я бродил по странице документации по файлу цепочки инструментов cmake (* 1046)* и я случайно обнаружил одну переменную с именем «CMAKE_SYSROOT», которая является необязательной и может использоваться, если в хост-системе есть другой системный корень, отличный от этого, поэтому я попытался установить переменную следующим образом:
set(CMAKE_SYSROOT "${ROOTFS_PATH}")
И чудесным образом это сработало: он перестал искать библиотеки в моей корневой системе (/ lib / ..., / usr / lib / ...), поэтому я предполагаю, что в файловой системе есть те, где текоторые были наконец использованы, и компиляция успешно завершилась как для библиотеки, так и для зависимого приложения.