linux下使用ndk编译curl-7.84.0版本时遇到如下问题,在此记录。
1、语法错误syntax error near unexpected token `else'
问题表现:
./configure: line 33892: syntax error near unexpected token `else'
./configure: line 33892: `else'
问题分析:
configure文件为打包时自动生成,修改无用,真正需要修改的是configure.ac文件。
解决方案:
将configure.ac文件2390-2408行代码如下:
#
dnl WinIDN requires a minimum supported OS version of at least Vista (0x0600)
AC_COMPILE_IFELSE([
AC_LANG_PROGRAM([[
#include <windows.h>
]],[[
#if (WINVER < 0x600) && (_WIN32_WINNT < 0x600)
#error
#endif
]])
],[
],[
CFLAGS=`echo $CFLAGS | $SED -e 's/-DWINVER=[[^ ]]*//g'`
CFLAGS=`echo $CFLAGS | $SED -e 's/-D_WIN32_WINNT=[[^ ]]*//g'`
CPPFLAGS=`echo $CPPFLAGS | $SED -e 's/-DWINVER=[[^ ]]*//g'`
CPPFLAGS=`echo $CPPFLAGS | $SED -e 's/-D_WIN32_WINNT=[[^ ]]*//g'`
WINIDN_CPPFLAGS="$WINIDN_CPPFLAGS -DWINVER=0x0600"
])
#
改为(即删除除第一行以外的代码):
#
dnl WinIDN requires a minimum supported OS version of at least Vista (0x0600)
#
再次编译后问题已解决。
2、隐式声明错误implicit declaration of function 'sched_yield'
问题表现:
In file included from easy.c:89:0:
easy_lock.h: In function 'curl_simple_lock_lock':
easy_lock.h:56:7: error: implicit declaration of function 'sched_yield' [-Werror=implicit-function-declaration]
sched_yield();
问题分析:
该报错是因为sched_yield函数为隐式声明,在开启了-Werror=implicit-function-declaration编译选项后,本该是warning的变成了error。
怪点1:查看所有源码之后发现奇怪之处,并没有引用其头文件#include<sched.h>的地方,有点无语。
怪点2:sched_yield函数的调用由宏HAVE_SCHED_YIELD控制,我并没有开启该宏,但编译依然报错。
解决方案:
方案一:开启HAVE_SCHED_YIELD宏,集成sched_yield函数。(在android ndk中存在该函数的头文件)
注:该方案依然无法解决问题,因为怪点1。
方案二:显式包含对应头文件
//easy_lock.h
#ifdef HAVE_SCHED_YIELD
#include <sched.h>
#endif
方案三:在方案二添加头文件出取消HAVE_SCHED_YIELD宏定义
//easy_lock.h
#undef HAVE_SCHED_YIELD
方案二三亲测有效。
总结
1、configure文件问题需要在configure.ac文件中修改;
2、代码语法问题需要根据具体代码分析修改;
至此,libcurl编译成功。