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

时间:2014-03-09 08:52:37

标签: gcc arm cross-compiling 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 个答案:

答案 0 :(得分:1)

您正尝试在Android上使用Linux编译器。它并没有被彻底打破,因为Android Linux,但Android没有标配的同一套库。

可能安装Linux库(来自相应的CodeSourcery libc目录),但这是一个棘手的过程,因为Android文件已经在标准位置,所以它们必须安装到一侧,不知何故,如果你不知道你在做什么,它将陷入一个可怕的混乱。

最好的解决方案可能是使用完全静态链接。也就是说,您可能仍然发现libcurl不满意,因为即使是静态链接,也要求它可以dlopen主机系统的DNS库,而我不知道Android是如何做到这一点的。

我建议你试着抓住一个专门设计的Android工具链(我相信Linaro做一个),这个工具链是为了使用Android的“Bionic”C库,而不是GNU / Linux的“Glibc”。

答案 1 :(得分:0)

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

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

它有效吗?

这是有效的,因为你静态编译所以不需要将libc复制到目标。

pcre是您动态构建的。check file ./pcregrep如果其动态链接

最简单的方法是静态编译为hello,例如。并在你的目标上运行。

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