vslibcurl编译
A. 求助.编译libcurl+ssl的时候一直不支持ssl-CSDN论坛
原因是linux有一个SELinux保护模式引起的。1.关闭SELINUX的方法:vi/etclinux/config将SELINUX=enforcing改成SELINUX=disabled需要重启2.不关闭SELINUX的方法:#setenforce0#chcon-c-v-R-usystem_u-robject_r-ttextrel_shlib_t/usr/local/apache/moles/libphp5.so#servicehttpdrestart#setenforce1
B. Win10下NDK 编译curl&protobuf
Android开发者编写指南
在Windows环境下进行NDK(Native Development Kit)编译curl与protobuf的过程,以下步骤作为参考:
创建curl编译目录(CURL_BUILD_DIR)位于:
c: dk\21.4.7075529\samples\curl\jni
将curl源码(curl-8.2.1)放入CURL_BUILD_DIR下。
在CURL_BUILD_DIR创建Android.mk文件,配置编译参数。
准备curl_config.h文件,生成非Windows版本以避免编译时寻找错误路径,建议在cygwin环境下使用configure命令进行生成。
执行ndk-build命令于CURL_BUILD_DIR,生成libcurl.so。
创建protobuf编译目录(PROTOBUF_BUILD_DIR)位于:
c: dk\21.4.7075529\samples\protobuf\jni
在PROTOBUF_BUILD_DIR创建Android.mk文件,配置protobuf编译参数。
将protobuf源码protobuf-cpp-3.21.12下的src目录复制至PROTOBUF_BUILD_DIR。
执行ndk-build命令于PROTOBUF_BUILD_DIR,生成libprotobuf.a。
若遇到集成libprotobuf.a时出现"undefined reference to __android_log_write'"错误,直接在src/google/protobuf/stubs/common.cc中注释相关代码行即可解决。
C. libcurl是什么语言开发的
编译源码
有很多种不同的方式来编译C语言代码。这里使用UNIX平台下的编译方式。即使你使用的是其他的操作系统,你仍然可以通过阅读本文档来获取许多有用的信息。
编译
你的编译器必须知道libcurl头文件的位置。所以在编译的时候,你要设置头文件的包含路径。可以使用curl-config工具来获取这方面的信息:
$ curl-config –cflags
链接
编译完源码(这时的源代码不是指libcurl的源代码,你是你自己写的程序代码)之后,你还必须把目标文件链接成单个可执行文件。你要链接libcurl库,以及libcurl所依赖的其他库,例如OpenSLL库。当然可能还需要一些其他的操作系统库。最后你还要设置一些编译选项,当然可以使用curl-config工具简化操作:
$curl-config –libs
是否使用SSL
定制编译libcurl。与其他库不同的是,libcurl可以定制编译,根据实际需要是否支持某些特性,如是否支持SSL传输,像HTTPS和FTPS。如果决定需要支持SSL,必须在编译时正确的设置。可以使用’curl-config’来判断libcurl库是否支持SSL:
$ curl-config –feature
autoconf宏
当你编写配置脚本来检测libcurl及其相应设置时,你可以使用预定义宏。文档docs/libcurl/libcurl.m4告诉你如何使用这些宏。
跨平台的可移植的代码
libcurl的开发人员花费很大的努力,使libcurl尽可能在大多数平台上正常运行。
全局初始化
应用程序在使用libcurl之前,必须先初始化libcurl。libcurl只需初始化一次。可以使用以下语句进行初始化:
curl_global_init();
curl_global_init()接收一个参数,告诉libcurl如何初始化。参数CURL_GLOBAL_ALL 会使libcurl初始化所有的子模块和一些默认的选项,通常这是一个比较好的默认参数值。还有两个可选值:
CURL_GLOBAL_WIN32
只能应用于Windows平台。它告诉libcurl初始化winsock库。如果winsock库没有正确地初始化,应用程序就不能使用socket。在应用程序中,只要初始化一次即可。
CURL_GLOBAL_SSL
如果libcurl在编译时被设定支持SSL,那么该参数用于初始化相应的SSL库。同样,在应用程序中,只要初始化一次即可。
libcurl有默认的保护机制,如果在调用curl_easy_perform时它检测到还没有通过curl_global_init进行初始化,libcurl会根据当前的运行时环境,自动调用全局初始化函数。但必须清楚的是,让系统自已初始化不是一个好的选择。
当应用程序不再使用libcurl的时候,应该调用curl_global_cleanup来释放相关的资源。
在程序中,应当避免多次调用curl_global_init和curl_global_cleanup。它们只能被调用一次。