我正在尝试使用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
它有效
答案 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从工具链复制到目标并导出它然后它将起作用