Кросс-компиляция PCRE с помощью набора инструментов CodeSourcery?
Я пытаюсь собрать PCRE
с CodeSourcery
вот мой скрипт настройки
#!/bin/bash
PROJECT_BASE=$(pwd);
PROJECT_REPOSITORY=$PROJECT_BASE/download
INSTALL_PREFIX=$PROJECT_BASE/compiled/armv5te
mkdir -p $INSTALL_PREFIX && mkdir -p $PROJECT_BASE/download && mkdir -p $PROJECT_BASE/build
export TOOL_PREFIX=${HOME}/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux
SYSROOT=$HOME/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/arm-none-linux-gnueabi/libc
export CC="${TOOL_PREFIX}/bin/arm-none-linux-gnueabi-gcc --sysroot=$SYSROOT"
export CXX="${TOOL_PREFIX}/bin/arm-none-linux-gnueabi-g++ --sysroot=$SYSROOT"
#CC="${TOOL_PREFIX}/bin/arm-none-linux-gnueabi-gcc"
#CXX="${TOOL_PREFIX}/bin/arm-none-linux-gnueabi-g++"
export AR="${TOOL_PREFIX}/bin/arm-none-linux-gnueabi-ar"
export RANLIB="${TOOL_PREFIX}/bin/arm-none-linux-gnueabi-ranlib"
export LD="${TOOL_PREFIX}/bin/arm-none-linux-gnueabi-ld"
export STRIP="${TOOL_PREFIX}/bin/arm-none-linux-gnueabi-strip"
export NM="${TOOL_PREFIX}/bin/arm-none-linux-gnueabi-nm"
export CCLD=$LD
export CHOST=arm-none-linux-gnueabi
PARENT_DIR=$(pwd);
cd $PROJECT_BASE/build && tar -xzvf $PROJECT_REPOSITORY/pcre-8.34.tar.gz && cd ./pcre-8.34
#LDFLAGS_DEP="-lc"
#CPPFLAGS="-I${INSTALL_PREFIX}/include"
# CFLAGS="-march=armv5t -marm -mlittle-endian -mglibc -static -I${INSTALL_PREFIX}/include"
LDFLAGS="-L${INSTALL_PREFIX}/lib"
./configure --prefix=$INSTALL_PREFIX/pcre --with-sysroot --target=arm-none-linux-gnueabi --host=x86_64 && make && make install;
cd -;
cd ${PARENT_DIR};
теперь он успешно скомпилирован, но когда я попытался выполнить этот двоичный файл на Android, я получаю:
./pcregrep: not found
также имеет аналогичную проблему при кросс-компиляции curl, openssl, но когда я запускаю тестовый код
#include <stdio.h>
int main(){
printf("Hell ya it works");
return 0;
}
и скомпилируйте следующую опцию
arm-none-linux-gnueabi-gcc hello.c -static -o hello.c
оно работает
2 ответа
Вы пытаетесь использовать компилятор Linux с Android. Он не полностью сломан, потому что Android - это Linux, но Android не поставляется с тем же набором библиотек, что и стандартный.
Вероятно, возможно установить библиотеки Linux (из соответствующего каталога libc CodeSourcery), но это сложный процесс, потому что файлы Android уже будут в стандартных местах, поэтому их придется каким-то образом устанавливать на одну сторону, и если вы не знаю, что ты делаешь, это приведет к ужасному беспорядку.
Лучшее решение, вероятно, заключается в использовании полностью статических ссылок. Тем не менее, вы все равно можете обнаружить, что libcurl несчастен, потому что, даже статически связанный, он требует, чтобы он мог dlopen
библиотека DNS хост-системы, и я не знаю, как Android любит это делать.
Я бы посоветовал вам попробовать воспользоваться специально разработанным для Android набором инструментов (я полагаю, что Линаро так и делает), который предназначен для использования Android-библиотеки Bionic C, а не GNU/Linux Glibc.
Это несоответствие между libc цепочки инструментов исходного кода и libc, который находится в целевых rootfs. libc в хосте кросс-компилятор и развернуты на устройстве rootfs разные
arm-none-linux-gnueabi-gcc hello.c -static -o hello.c
это работает
Это работает, так как вы компилируете статически, поэтому нет необходимости копировать libc для нацеливания здесь.
Но pcre
Вы построили динамически.check file ./pcregrep
если его динамическая связь, то
один самый простой способ компилировать статически как привет, например. и беги на свою цель.
в противном случае скопируйте libc из цепочки инструментов в целевой и экспортируйте его, тогда он будет работать