使用独立工具链 android arm 构建本机库
Posted
技术标签:
【中文标题】使用独立工具链 android arm 构建本机库【英文标题】:Building native library with standalone toolchain android arm
【发布时间】:2012-01-26 05:20:32
【问题描述】:
我正在尝试将 libraw 构建为 android 共享库。看起来这个库太复杂了,无法与 Android.mk 等一起使用,或者更好:我还没有能力这样做。
我尝试了使用 NDK 中的独立工具链的路线,但是在编译这个库时我卡住了。
这是我编译库的路径。请指出我是否犯了明显的错误:
我下载了 ndk。
跑:make-standalone-toolchain.sh
将该独立工具链的bin
文件夹添加为我的PATH
中的第一项。
用--host=arm-linux-androideabi
运行./configure
。这成功了
跑make
,这里崩溃得非常快。
LibRaw-0.14.4$ 制作
depbase=`echo 内部/dcraw_common.lo | sed 's|[^/]*$|.deps/&|;s|\.lo$||'`;\
/bin/bash ./libtool --tag=CXX --mode=compile arm-linux-androideabi-g++ -DPACKAGE_NAME=\"LibRaw\" -DPACKAGE_TARNAME=\"libraw\" -DPACKAGE_VERSION=\"0.14.4\" -DPACKAGE_STRING=\"LibRaw\ 0.14.4\" -DPACKAGE_BUGREPORT=\"info@libraw.org\" -DPACKAGE_URL=\"http://www.libraw.org\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H =1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I。 -I/usr/local/include -g -O2 -MT internal/dcraw_common.lo -MD -MP -MF $depbase.Tpo -c -o internal/dcraw_common.lo internal/dcraw_common.cpp &&\
mv -f $depbase.Tpo $depbase.Plo
libtool:编译:arm-linux-androideabi-g++ -DPACKAGE_NAME=\"LibRaw\" -DPACKAGE_TARNAME=\"libraw\" -DPACKAGE_VERSION=\"0.14.4\" "-DPACKAGE_STRING=\"LibRaw 0.14.4\"" -DPACKAGE_BUGREPORT=\"info@libraw.org\" -DPACKAGE_URL=\"http://www.libraw.org\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H =1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I。 -I/usr/local/include -g -O2 -MT internal/dcraw_common.lo -MD -MP -MF internal/.deps/dcraw_common.Tpo -c internal/dcraw_common.cpp -fPIC -DPIC -o internal/.libs /dcraw_common.o
internal/dcraw_common.cpp:在成员函数“void LibRaw::read_shorts(ushort*, int)”中:
internal/dcraw_common.cpp:119: 错误: 'swab' 未在此范围内声明
internal/dcraw_common.cpp:在成员函数“void LibRaw::write_ppm_tiff()”中:
internal/dcraw_common.cpp:9235: 错误: 'swab' 未在此范围内声明
make: *** [internal/dcraw_common.lo] 错误 1
我怀疑此错误消息在 *** 中是否有用,但我想知道是否应该应用一些额外的标志或配置来使其正常工作?
请注意,如果只为我的系统编译而不进行交叉编译,我可以成功编译这个库。 (Linux 32 位)。
当我正在寻找为 Android (here) 构建 GDAL 的说明时,它使用了 LIBS="-lsupc++ -lstdc++"
的附加设置。这链接了 STL 和 C++ 异常?
但是,当我在运行 configure
之前设置它们时,我会立即收到如下错误:
configure:3018: 检查 C++ 编译器是否工作
配置:3040:arm-linux-androideabi-g++ conftest.cpp -lsupc++ -lstdc++ >&5
/tmp/android-chain/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld:找不到-lsupc++
collect2: ld 返回 1 个退出状态
所以,我有点卡住了。有人出主意吗?
【问题讨论】:
【参考方案1】:
我必须添加swab
函数的实现,因为NDK 没有那个。
之后这个编译得很好(但我使用了 crystax ndk)。
一种更好的工具方法是只使用Android.mk
文件并使用ndk-build
来编译它。
【讨论】:
嗨@Peterdk你能告诉我你在哪里实现了swab函数吗?还是你自己写的?
嗨,我想我刚刚搜索了一下。不是我自己写的。也许还可以将它与搜索 cristax 结合起来。
您好,请在此处添加链接,然后供其他用户使用。 :)
这里是链接swab.cpp【参考方案2】:
出现问题底部的链接器错误是因为来自 NDK r7 的 make-standalone-toolchain.sh
创建了不完整的工具链(它错过了一些库,包括 libsupc++.a
)。我建议您尝试从以前的 NDK 版本之一制作工具链(r6b 应该没问题)。
【讨论】:
以上是关于使用独立工具链 android arm 构建本机库的主要内容,如果未能解决你的问题,请参考以下文章
linux / uinput.h缺少32位arm android ndk独立工具链?
在为arm64 Android手机构建应用程序包时,在ApplicationInfo.nativeLibraryDir中找不到本机库
为 arm64 Android 手机构建应用程序包时在 ApplicationInfo.nativeLibraryDir 中找不到本机库
如何在 Windows 7 中构建 android 独立工具链
如何构建MIPS交叉编译工具链
STM32 Eclipse + ARM GNU 工具链错误链接器