Gcc 使用CodeSourcery工具链交叉编译PCRE?

Gcc 使用CodeSourcery工具链交叉编译PCRE?,gcc,arm,cross-compiling,pcre,codesourcery,Gcc,Arm,Cross Compiling,Pcre,Codesourcery,我正在尝试使用codesource 这是我的配置脚本 #!/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_BAS

我正在尝试使用
codesource
这是我的配置脚本

#!/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;
}

它的工作原理是源代码工具链的libc与目标rootfs中的libc不匹配。 主机交叉编译器中的libc与部署在设备rootfs上的libc不同

arm none linux gnueabi gcc hello.c-static-o hello.c

它起作用了`

这是因为您是静态编译的,所以这里不需要将libc复制到target

但是
pcre
是动态构建的。
检查文件。/pcregrep
如果它是动态链接的,那么

一种最简单的方法是静态编译为hello,并在目标上运行


否则,将libc从工具链复制到目标并将其导出,然后它将工作

您正在尝试将Linux编译器与Android一起使用。它并没有完全崩溃,因为Android是Linux,但Android并没有像标准的那样提供相同的库集

也许可以安装Linux库(从适当的CodeSourcery libc目录),但这是一个棘手的过程,因为Android文件已经在标准位置,因此它们必须安装在一边,如果你不知道自己在做什么,就会陷入可怕的混乱

最好的解决方案可能是完全使用静态链接。也就是说,您可能仍然会发现libcurl不高兴,因为即使是静态链接,它也要求它能够
dlopen
主机系统的DNS库,我不知道安卓喜欢这样做


我建议您尝试使用专门构建的安卓工具链(我相信Linaro也会这么做),该工具链旨在使用安卓的“仿生”C库,而不是GNU/Linux的“Glibc”。

添加
LDFALSG=“-lc”后很奇怪
生成的二进制文件已成功编译,但在
Linaro
NDK
工具链的情况下,我甚至不需要使用这些标志,我假设CodeSourcery无法检测到
--sysroot
,我认为CodeSourcery编译器可能有一个内置的
--sysroot
值,可能会覆盖您的值。您可以使用
-v
进行确认。一般来说,将为Glibc构建的编译器指向另一个libc(如Bionic)是不安全的。它将以微妙的方式配置错误。我认为使用此工具链您可能会做得更好:
arm-none-linux-gnueabi-gcc hello.c -static -o hello.c