linux编译libcurl时遇到的问题总结

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编译成功。

猜你喜欢

转载自blog.csdn.net/wquasdf/article/details/126028387
今日推荐