LINUX.ORG.RU

Сборка под Андроид с помощью CMake

 , ,


1

1

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

Скачал android-ndk-r7-crystax-5.beta2, ибо официальный NDK С++0х не умеет, а мне оно нужно.

Из проекта OpenCV спер android.toolchain.cmake

При попытке собрать пример из NDK все работает, но там исходники только на С, а мне нужен С++.

При компиляции срр получаю сообщение - «fatal error: thread: No such file or directory»

Чего оно хочет как-бы понятно. Проблема в том, что в ключах компилера только:

-isystem /opt/android-ndk-r7-crystax-5.beta2/platforms/android-8/arch-arm/usr/include
-isystem /opt/android-ndk-r7-crystax-5.beta2/sources/cxx-stl/gnu-libstdc++/include

Ну ясно дело, попробовал подокидывать путей для не найденых хидеров. Да что-то их сильно много. То c++config.h не находит, то wchar.h...

Может кто в курсе как оно вообще в gcc плюсовые библиотеки по каталогам раскиданы? Ну или какие пути захаркоджены в gcc для сборки на хосте?

★★★

Какой версией GCC собираете? С++11 нормально поддерживается только начиная с 4.7.

По вашей ссылке написано:

CrystaX NDK содержит две версии компилятора (toolchain): 4.4.3 (старый, такой же как и в Google NDK) и 4.6.3 (новый).

По умолчанию 4.6.3 toolchain не используется.

Чтобы начать использовать C++0x в вашем проекте, добавьте следующую строку в Application.mk:

APP_USE_CPP0X := true

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

Мне сильно много от С++0х не надо. Этот самый код успешно собирается в линухе на gcc4.5.чего-то-там. Так что 4.6.3 мне уж точно хватит.

Их CrystaX NDK make вызывает: /opt/android-ndk-r7-crystax-5.beta2/toolchains/arm-linux-androideabi-4.6.3/prebuilt/linux-x86/bin/arm-linux-androideabi-g++

Так что и тут все ОК. Ключи -std=c++0x -Wc++0x-compat тоже присутствуют.

Чтобы начать использовать C++0x в вашем проекте, добавьте следующую строку в Application.mk:

Это не для меня. У меня Application.mk вообще нету ) Я ж писал - у меня сборка с помощью CMake.

AF ★★★
() автор топика

И да, не проще ли поискать тулчейн в пакетах дистрибутива? В моем арче, например:


unfo-job:/home/unfo # yaourt -Ss cross-arm
aur/cross-arm-elf-base 0.1-1 (Out of Date) (9)
    You need this package to build cross-arm-elf-gcc. After your build it replace this package with cross-arm-elf-newlib
aur/cross-arm-elf-binutils-sysroot 2.20.1-1 (Out of Date) (10)
    A set of programs to assemble and manipulate binary and object files (with sysroot support)
aur/cross-arm-elf-gcc 4.6.1-1 (Out of Date) (28)
    The GNU Compiler Collection - Cross compiler for ARM target
aur/cross-arm-elf-gdb 7.3.1-1 (Out of Date) (13)
    The GNU Debugger for ARM target
aur/cross-arm-elf-newlib 1.19.0-2 (Out of Date) (30)
    Newlib is a C library intended for use on embedded systems.
aur/cross-arm-linux-gnueabi-binutils 2.22-1 (19)
    A set of programs to assemble and manipulate binary and object files
aur/cross-arm-linux-gnueabi-gcc-base 4.6.2-1 (16)
    The GNU Compiler Collection
aur/cross-arm-linux-gnueabi-newlib 1.18.0-1 (2)
    This package provides newlib for the arm-linux-gnueabi toolchain.
aur/cross-arm-none-eabi-binutils 2.21.1-1 (Out of Date) (25)
    A set of programs to assemble and manipulate binary and object files
aur/cross-arm-none-eabi-gcc 4.6.1-1 (Out of Date) (19)
    The GNU Compiler Collection - Cross compiler for ARM target
aur/cross-arm-none-eabi-gcc-base 4.6.0-1 (Out of Date) (22)
    The GNU Compiler Collection
aur/cross-arm-none-eabi-gdb 7.3.1-1 (Out of Date) (12)
    The GNU Debugger for ARM target
aur/cross-arm-none-eabi-newlib 1.19.0-2 (Out of Date) (22)
    Newlib is a C library intended for use on embedded systems.

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

И да, не проще ли поискать тулчейн в пакетах дистрибутива?

Не, только не это! Я уже наступал на грабли в андроиде, когда надо было использовать со-шку собранную хз каким тулчейном. Исходников к ней естессно небыло.

В принципе можно подсмотреть, как будет вызывать gcc ndk-build и сделать по аналогии в cmake, но хотелось бы попутно разобраться в вопросе более досконально.

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

Если с компилятором все нормально, то тогда надо смотреть android.toolchain.cmake.

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

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

Спасибо кеп)

Я как раз в первом посте написал, какие пути есть, и спрашиваю, какие надо добавить?

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

А не проще написать .mk-файлы для этой библиотеки, и собрать ndk-build'ом.

Оооо! Я ждал этого вопроса, иначе это был бы не ЛОР.

Оно конечно можно, да поддерживать для одной библиотеки сборку двумя системами - это как то не по корану.

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

Книжка из CMake под рукой, выдержка из главы по кросс-компиляции.

# where are the target libraries and headers installed
set(CMAKE_FIND_ROOT_PATH /path/to/libs /path/to/headers)
unfo ★★★★★
()

Чувак, у андроида СВОЯ библиотека libc/libstdc++, т.о. ты можешь собирать ТОЛЬКО то что она поддерживает. А она С++0х не поддерживает. Т.о. тебе надо портировать свой говнокод под андроед. Это и есть суть портирования.

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

Прицепить доп. пути не проблема.

Я просто не хочу заниматься ковровым бомбометанием для каждого не найденного хидера. Я хочу понять - как это сделать правильно!

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

Статически - можно. Однако надо быть аккуратным. И если только линковаться со своей всей целиком libc xD.

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

Чувак, ты не прав. Точнее прав, но не в теме.

Оригинальный NDK от гугла - это таки УГ. Но я пытаюсь заюзать android-ndk-r7-crystax-5.beta2. Погугли, что это такое и чем оно отличается от гуглового поделия.

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

хз, я все с буста затащил чтобы меньше было проблем, собираю все через .mk конечно, cmake только и видел в OpenCV, но не разрирался с ним.

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

Статически - можно. Однако надо быть аккуратным. И если только линковаться со своей всей целиком libc

Спасибо, за еще один важный момент

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

там все просто

export ANDROID_NDK=/opt/android-ndk-r7-crystax-5.beta2
export ANDROID_ABI=armeabi-v7a
export ANDROID_NATIVE_API_LEVEL=android-8
cmake -DCMAKE_TOOLCHAIN_FILE=../Cmake/toolchainandroid.toolchain.cmake ..

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

Хорошо, сдаюсь.

Может быть поможет это:

NDK=~/android-ndk-r7b/
PLATFORM=$NDK/platforms/android-8/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/
function build_one
{
./configure --target-os=linux \
    --prefix=$PREFIX \
    --enable-cross-compile \
    --extra-libs="-lgcc" \
    --arch=arm \
    --cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
    --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
    --nm=$PREBUILT/bin/arm-linux-androideabi-nm \
    --sysroot=$PLATFORM \
    --extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 $OPTIMIZE_CFLAGS " \
    --disable-shared \
    --enable-static \
    --extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog" \
    --disable-everything \
    --enable-demuxer=mov \
    --enable-demuxer=h264 \
    --disable-ffplay \
    --enable-protocol=file \
    --enable-avformat \
    --enable-avcodec \
    --enable-decoder=rawvideo \
    --enable-decoder=mjpeg \
    --enable-decoder=h263 \
    --enable-encoder=h263 \
    --enable-decoder=mpeg4 \
    --enable-encoder=mpeg4 \
    --enable-decoder=h264 \
    --enable-encoder=h264 \
    --enable-parser=h264 \
    --enable-hwaccel=h264_vaapi \
    --disable-network \
    --enable-zlib \
    --disable-avfilter \
    --disable-avdevice \
    $ADDITIONAL_CONFIGURE_FLAG

Аргументы configure, с которыми я собираю ffmpeg.

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

Я хочу понять - как это сделать правильно!

Прицепить же папку с хидерами твоего тулчейна :) Если в нем есть не все хидеры - значит он точно под С заточен, а не под С++, надо искать другой.

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

с ним сильно не разбирался,
год назад как-то попробывал собрать, собрал, потом че-то пытался еще сделать, он через 3-10 мин. постоянно выкидывал сегфол., а потом как-то не до него было

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

он тоже не шибко классный,

Конкретные факты, опыт работы с ним есть?

Насколько я понял, то там только поддержка wchar не полная и в процессе допиливания. А в остальном вроде все ок.

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

Проблемка в том, что там не одна папка, и єто наводит меня на подозрение, что я что-то где-то недопонял.

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

FFMPEG не показатель, он же на С без плюсов. А у меня проблемы только с плюсовым кодом.

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

Щас в ffmpeg есть скрипт tools/build_libstagefright с его помощью собрать ffmpeg не проблема.

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

У меня нет, вот и спрашиваю о впечатлениях и найденных граблях

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

Погугли, что это такое и чем оно отличается от гуглового поделия.

rtti (нахрен не нужно), wchar_t (вообще вне стандарта, потому в гугловом ndk он равен одному байту).
Для своих проектов я не вижу ни единого смысла в использовании crystax.

andreyu ★★★★★
()

Вроде так получается:

Стандартная библиотека платформоНЕзависимая часть - /opt/android-ndk-r7-crystax-5.beta2/sources/cxx-stl/gnu-libstdc++/include/4.6.3
Стандартная библиотека платформозависимая часть - /opt/android-ndk-r7-crystax-5.beta2/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a/4.6.3/include
Заголовки Андроида- /opt/android-ndk-r7-crystax-5.beta2/platforms/android-8/arch-arm/usr/include
wchar.h и еще какая то специфическая для crystax фигня - /opt/android-ndk-r7-crystax-5.beta2/sources/crystax/include


В стандартном NDK эти же пути совсем другие.
AF ★★★
() автор топика
Ответ на: комментарий от Jetty

Так взять тогда новую libcxx, она говорят хорошо умеет C++11

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

ну если ты его отключишь в конфиге, и что-то соберешь не свое которое его использует, когда и увидишь

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

rtti же есть в станд. и кристахе, а то у тебя так написано о нем что не ясно ...

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