Ошибки компиляции при попытке связать библиотеки при кросс-компиляции - PullRequest
0 голосов
/ 24 сентября 2019

решено - Объяснение в конце поста

Я работаю над проектом и сейчас мне нужно сделать кросс-компиляцию двух пакетов для 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 / ...), поэтому я предполагаю, что в файловой системе есть те, где текоторые были наконец использованы, и компиляция успешно завершилась как для библиотеки, так и для зависимого приложения.

...