当我试图将libpcsclite移植到Android时,“对pthread_atfork的未定义引用”

时间:2012-09-11 13:35:15

标签: android android-ndk

Android ndk告诉我"undefined reference to pthread_atfork"我试图交叉编译libpcsclite for Android

实际上我已经知道Android(Android文档)的Bionic库中没有pthread_atfork函数,但必须在pcsclite库中调用pthread_atfork。在这种情况下有没有解决方案?

3 个答案:

答案 0 :(得分:0)

看看这个:http://comments.gmane.org/gmane.comp.handhelds.android.ndk/15982

我相信函数pthread_atfork是在Bionic库中实现的(但是,没有记录)。

我认为您所要做的就是声明要使用它。

通常的警告:如果您使用未记录的方法,它们可能无法正常工作或将来可能会被弃用。

答案 1 :(得分:0)

在android-10 / v2.3.6 / Gingerbread之后看起来pthread_atfork()不是added to bionic libc。如果您要定位旧版Android,则必须在项目中加入pthread-atfork.c或较新的pthread_atfork.cpp,或者根本不使用pthread_atfork()

答案 2 :(得分:0)

PROGRAM
  

此值默认为使用中的NDK支持的最低API级别

在我的上下文中,使用android-9默认值。

如果您在$ {ANDROID-NDK} DIR上执行以下shell,

-DANDROID_PLATFORM=android-21

find_path=$1 grep_str=$2 SOS=`find ${find_path} -name *.so` for item in $SOS do echo ======= $item objdump -Tt $item |grep ${grep_str} done 输出:

sh echo.sh . pthread_atfork

您会发现以下消息:======= ./platforms/android-9/arch-mips/usr/lib/libc.so ======= ./platforms/android-12/arch-x86/usr/lib/libc.so 00009420 g F .text 0000000a pthread_atfork 00009420 g DF .text 0000000a LIBC pthread_atfork 是在libc.so上使用android-12而不是android-9定义的。

因此,当您使用cmake或其他工具进行交叉编译时,您需要添加pthread_atfork [仅gt android-9]

您可以使用cmake尝试此命令

-DANDROID_PLATFORM=android-21