LINUX.ORG.RU

CMake c CMAKE_SYSROOT не видит библиотеки в rootfs

 , ,


0

1

CMake c CMAKE_SYSROOT не видит библиотеки в rootfs Выглядит это так:

/var/lib/tftpboot/rootfs/usr/lib/arm-linux-gnueabihf/librt.a(timer_create.o): In function `timer_create':
(.text+0x44): undefined reference to `__libc_do_syscall'
/var/lib/tftpboot/rootfs/usr/lib/arm-linux-gnueabihf/librt.a(timer_create.o): In function `timer_create':
(.text+0x126): undefined reference to `__libc_do_syscall'
/var/lib/tftpboot/rootfs/usr/lib/arm-linux-gnueabihf/librt.a(timer_settime.o): In function `timer_settime':
(.text+0x8): undefined reference to `__libc_do_syscall'
/var/lib/tftpboot/rootfs/usr/lib/arm-linux-gnueabihf/librt.a(timer_routines.o): In function `timer_helper_thread':
(.text+0x4e): undefined reference to `__libc_do_syscall'
/var/lib/tftpboot/rootfs/usr/lib/arm-linux-gnueabihf/librt.a(timer_routines.o): In function `timer_sigev_thread':
(.text+0xf4): undefined reference to `__libc_do_syscall'
/var/lib/tftpboot/rootfs/usr/lib/arm-linux-gnueabihf/librt.a(timer_routines.o):(.text+0x13e): more undefined references to `__libc_do_syscall' follow
/var/lib/tftpboot/rootfs/usr/lib/arm-linux-gnueabihf/librt.a(timer_routines.o): In function `__start_helper_thread':
(.text+0x186): undefined reference to `pthread_atfork'
/var/lib/tftpboot/rootfs/usr/lib/arm-linux-gnueabihf/librt.a(librt-cancellation.o): In function `__librt_disable_asynccancel':
(.text+0xda): undefined reference to `__libc_do_syscall'
collect2: error: ld returned 1 exit status

библиотека librt-2.19.so и линк на нее librt.so.1 лежат в rootfs/lib/arm-linux-gnueabihf

CMAKE_TOOLCHAIN_FILE:

SET(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

# specify the cross compiler
SET(CMAKE_C_COMPILER   /opt/gcc-linaro-arm-linux-gnueabihf-4.9/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER /opt/gcc-linaro-arm-linux-gnueabihf-4.9/bin/arm-linux-gnueabihf-g++)

# where is the target environment 
SET(CMAKE_SYSROOT /var/lib/tftpboot/rootfs )
#SET(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/lib ${CMAKE_SYSROOT}/usr/lib)

#SET(CMAKE_FIND_ROOT_PATH /var/lib/tftpboot/rootfs /opt/gcc-linaro-arm-linux-gnueabihf-4.9/arm-linux-gnueabihf/libc/usr )

# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

Такое окружение используется на двух компах: на одном проект собирается, на другом возникают ошибки (выше) с библиотеками.

При перемещении системных библиотеки в локальную директорию библиотек проекта сборка происходит успешно.

Установка переменных CMAKE_LIBRARY_PATH и CMAKE_FIND_ROOT_PATH ничего не дает.

Чего не хватает на втором компе?



Последнее исправление: zudwa (всего исправлений: 1)

Была такая проблема при сборке под android arm. Решилось переводом на qbs. Он не такой извратный, как cmake.

anonymous
()

gcc-linaro-arm-linux-gnueabihf-4.9

Поновее нет ничего? Не знаю в какой версии, но у gcc есть параметр -sysroot, который должен быть задан для кросскомпиляции. Проверь, какая команда компилера у тебя генерируется.

UVV ★★★★★
()
Ответ на: комментарий от UVV

bsp старый (ядро 3.4), так что, видимо, нет смысла использовать более новый компилятор.

При make VERBOSE=1 --sysroot параметр присутствует, только он похоже не работает.

zudwa
() автор топика

Я не специалист в кросскомпиляции, но у тебя либо вообще не подцепляется libc, либо подцепляется версия не совместимая с твоей librt.a (а librt-2.19.so тут вообще не причём, судя по всему).

cdslow ★★
()
Ответ на: комментарий от cdslow

если кратко, то undefined reference функции находятся в librt-2.19.so

ну и читай выше:

При перемещении системных библиотеки в локальную директорию библиотек проекта сборка происходит успешно.

zudwa
() автор топика

В качестве rootfs использовался образ корневой фс устройства (armbian)

Абсолютные ссылки на актуальные библиотеки в этом образе ведут в корневую хоста.

Тупо спасает создание ссылок в директориях библиотек хоста:

sudo ln -s /var/lib/tftpboot/rootfs/lib/arm-linux-gnueabihf/ /lib/arm-linux-gnueabihf
sudo ln -s /var/lib/tftpboot/rootfs/usr/lib/arm-linux-gnueabihf/ /usr/lib/arm-linux-gnueabihf

назначение CMAKE_FIND_ROOT_PATH и CMAKE_LIBRARY_PATH в совокупности с CMAKE_SYSROOT осталось загадкой.

zudwa
() автор топика
Последнее исправление: zudwa (всего исправлений: 1)
Ответ на: комментарий от zudwa

Абсолютные ссылки на актуальные библиотеки в этом образе ведут в корневую хоста.

Таки cmake ли виноват в этом?

dhampire ★★★
()
Ответ на: комментарий от dhampire

пмсм, если ссылка на библиотеку присутствует, а библиотеки по этой ссылке в текущей фс нет, следует самостоятельно вычислить путь относительно sysroot. только видимо уже тулчейн сам этим заниматься должен.

zudwa
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.