在项目中使用到curl所以找了一些资料,留个备份
前些日子,项目中要用curllib,所以就下了一个源码包编译,编译过程遇到一些小问题,在这与大家分享一下整个编译和使用这个库的方法:
首先,去http://curl.haxx.se/download.html网站上下个包,因为我是在windows下编译,所以下了个zip包。
第二步,当然是解压了,把zip包解开。里面包含了好几个目录,有兴趣可以看看其他目录,我们用的只有两个目录,一是lib目录,里面包含了库的源码,一个是include目录,包含对外提供的头文件。
第三步,用vs2005新建一个空的静态库工程,把lib下的源码添加到工程里,还有把Include 目录的头文件也加上。这时编译一下,会出如下问题:
1>e:\c++\curl编程\curllib7.21.7\src\easy.c(233) : warning C4273: “curl_global_init”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\curl.h(1815) : 参见“curl_global_init”的前一个定义
1>e:\c++\curl编程\curllib7.21.7\src\easy.c(301) : warning C4273: “curl_global_init_mem”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\curl.h(1830) : 参见“curl_global_init_mem”的前一个定义
1>e:\c++\curl编程\curllib7.21.7\src\easy.c(330) : warning C4273: “curl_global_cleanup”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\curl.h(1845) : 参见“curl_global_cleanup”的前一个定义
1>e:\c++\curl编程\curllib7.21.7\src\easy.c(363) : warning C4273: “curl_easy_init”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\easy.h(28) : 参见“curl_easy_init”的前一个定义
1>e:\c++\curl编程\curllib7.21.7\src\easy.c(394) : warning C4273: “curl_easy_setopt”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\easy.h(29) : 参见“curl_easy_setopt”的前一个定义
1>e:\c++\curl编程\curllib7.21.7\src\easy.c(504) : warning C4273: “curl_easy_perform”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\easy.h(30) : 参见“curl_easy_perform”的前一个定义
1>e:\c++\curl编程\curllib7.21.7\src\easy.c(562) : warning C4273: “curl_easy_cleanup”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\easy.h(31) : 参见“curl_easy_cleanup”的前一个定义
1>e:\c++\curl编程\curllib7.21.7\src\easy.c(597) : warning C4273: “curl_easy_getinfo”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\easy.h(46) : 参见“curl_easy_getinfo”的前一个定义
1>e:\c++\curl编程\curllib7.21.7\src\easy.c(614) : warning C4273: “curl_easy_duphandle”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\easy.h(61) : 参见“curl_easy_duphandle”的前一个定义
1>e:\c++\curl编程\curllib7.21.7\src\easy.c(717) : warning C4273: “curl_easy_reset”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\easy.h(74) : 参见“curl_easy_reset”的前一个定义
1>e:\c++\curl编程\curllib7.21.7\src\easy.c(752) : warning C4273: “curl_easy_pause”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\curl.h(2137) : 参见“curl_easy_pause”的前一个定义
1>e:\c++\curl编程\curllib7.21.7\src\easy.c(873) : warning C4273: “curl_easy_recv”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\easy.h(84) : 参见“curl_easy_recv”的前一个定义
1>e:\c++\curl编程\curllib7.21.7\src\easy.c(901) : warning C4273: “curl_easy_send”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\easy.h(95) : 参见“curl_easy_send”的前一个定义
1>escape.c
1>e:\c++\curl编程\curllib7.21.7\src\escape.c(73) : warning C4273: “curl_escape”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\curl.h(1771) : 参见“curl_escape”的前一个定义
1>e:\c++\curl编程\curllib7.21.7\src\escape.c(79) : warning C4273: “curl_unescape”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\curl.h(1792) : 参见“curl_unescape”的前一个定义
1>e:\c++\curl编程\curllib7.21.7\src\escape.c(84) : warning C4273: “curl_easy_escape”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\curl.h(1766) : 参见“curl_easy_escape”的前一个定义
1>e:\c++\curl编程\curllib7.21.7\src\escape.c(145) : warning C4273: “curl_easy_unescape”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\curl.h(1786) : 参见“curl_easy_unescape”的前一个定义
1>e:\c++\curl编程\curllib7.21.7\src\escape.c(196) : warning C4273: “curl_free”: dll 链接不一致
1> e:\c++\curl编程\curllib7.21.7\include\curl\curl.h(1803) : 参见“curl_free”的前一个定义
虽然编译成功了,但使用的时候会有链接不上的问题。
第四,当然就是解决上面这个问题了,造成这个问题的原因是头文件中函数声明的原型跟我们要编译的库设置不一致,我们虽然是编译静态库,但函数的声明却是动态形式,
解决这个问题的办法是在项目属性----》c/c++-------》预处理器-------》预处理定义中添加CURL_STATICLIB预处理定义就好了。这下重新编译警告就少很多了。
这样生成的库就可以用了。
第五,当然是测试这个库怎么用,我们再重新添加一个空的测试项目,在这个项目中添加写好的测试源码文件,把静态库导入,然后编译,会发现依然连接不上,原因在哪呢?原来在测试项目中也要把CURL_STATICLIB这个预定义添加到项目属性中。添加完,再重新编译,会发现出现更多的连接错误,
1>正在链接...
1>curlLib7.21.7.lib(easy.obj) : error LNK2019: 无法解析的外部符号 __imp__WSACleanup@0,该符号在函数 _win32_init 中被引用
1>curlLib7.21.7.lib(telnet.obj) : error LNK2001: 无法解析的外部符号 __imp__WSACleanup@0
1>curlLib7.21.7.lib(easy.obj) : error LNK2019: 无法解析的外部符号 __imp__WSAStartup@8,该符号在函数 _win32_init 中被引用
1>curlLib7.21.7.lib(telnet.obj) : error LNK2001: 无法解析的外部符号 __imp__WSAStartup@8
1>curlLib7.21.7.lib(asyn-thread.obj) : error LNK2019: 无法解析的外部符号 __imp__closesocket@4,该符号在函数 _destroy_async_data 中被引用
1>curlLib7.21.7.lib(connect.obj) : error LNK2001: 无法解析的外部符号 __imp__closesocket@4
1>curlLib7.21.7.lib(select.obj) : error LNK2001: 无法解析的外部符号 __imp__WSAGetLastError@0
1>curlLib7.21.7.lib(curl_addrinfo.obj) : error LNK2001: 无法解析的外部符号 __imp__WSAGetLastError@0
1>curlLib7.21.7.lib(tftp.obj) : error LNK2001: 无法解析的外部符号 __imp__WSAGetLastError@0
1>curlLib7.21.7.lib(telnet.obj) : error LNK2001: 无法解析的外部符号 __imp__WSAGetLastError@0
1>curlLib7.21.7.lib(ftp.obj) : error LNK2001: 无法解析的外部符号 __imp__WSAGetLastError@0
1>curlLib7.21.7.lib(asyn-thread.obj) : error LNK2019: 无法解析的外部符号 __imp__WSAGetLastError@0,该符号在函数 _Curl_resolver_getaddrinfo 中被引用
1>curlLib7.21.7.lib(transfer.obj) : error LNK2001: 无法解析的外部符号 __imp__WSAGetLastError@0
1>curlLib7.21.7.lib(sendf.obj) : error LNK2001: 无法解析的外部符号 __imp__WSAGetLastError@0
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
1>curlLib7.21.7.lib(curl_addrinfo.obj) : error LNK2019: 无法解析的外部符号 __imp__getservbyport@8,该符号在函数 _WspiapiLegacyGetNameInfo@28 中被引用
1>curlLib7.21.7.lib(tftp.obj) : error LNK2019: 无法解析的外部符号 __imp__sendto@24,该符号在函数 _tftp_send_first 中被引用
1>curlLib7.21.7.lib(tftp.obj) : error LNK2019: 无法解析的外部符号 __imp__recvfrom@24,该符号在函数 _tftp_receive_packet 中被引用
1>curlLib7.21.7.lib(ldap.obj) : error LNK2019: 无法解析的外部符号 __imp__ldap_unbind_s,该符号在函数 _Curl_ldap 中被引用
1>curlLib7.21.7.lib(ldap.obj) : error LNK2019: 无法解析的外部符号 __imp__ldap_msgfree,该符号在函数 _Curl_ldap 中被引用
1>curlLib7.21.7.lib(ldap.obj) : error LNK2019: 无法解析的外部符号 __imp__ber_free,该符号在函数 _Curl_ldap 中被引用
1>curlLib7.21.7.lib(ldap.obj) : error LNK2019: 无法解析的外部符号 __imp__ldap_memfreeW,该符号在函数 _Curl_ldap 中被引用
1>curlLib7.21.7.lib(ldap.obj) : error LNK2019: 无法解析的外部符号 __imp__ldap_value_free_len,该符号在函数 _Curl_ldap 中被引用
1>curlLib7.21.7.lib(ldap.obj) : error LNK2019: 无法解析的外部符号 __imp__ldap_get_values_lenW,该符号在函数 _Curl_ldap 中被引用
1>curlLib7.21.7.lib(ldap.obj) : error LNK2019: 无法解析的外部符号 __imp__ldap_next_attributeW,该符
Guido van Rossum于1989年底创建python;
Python源文件通常用.py扩展名。Python是按照字节编译的,其结果就是可以生成一种近似机器语言的中间形式。 官网:http://python.org,可以下载相关软件;
输出:
1、print语句:程序输出 print ‘hello World’;
2、下划线 _ 在解释器中表示最后一个表达式的值;
3、print语句与字符串操作符(%)结合使用,可实现字符串替换功能:
输入:
1、raw_input() 内建函数,读取标准输入并读取数据赋值给只定变量;
>>> print user;
注:内建函数help(),获取一个函数的帮助,如:help(raw_input)
2、input()只接受数字类型输入;
注释:
1、 从 # 开始,直到一行结束都是注释。
2、 文档字符串特别注释,在模块、类或者函数的起始添加一个字符串,起在线文档功能
"this is a doc string."
return True
操作符:
+ - * / // % **
python 有两种除法,单斜杠为传统除法(取比商小的最大整数),双斜杠用作浮点除法(对结果四舍五入)
双星号(**) 表示乘方操作;
操作符优先级从高到低为 ** *or/ +-
比较操作符: < <= > >= == != or <> 逻辑操作符 and or not
False
>>> 2 > 4 or 2 < 4
True
>>> 3 < 4 < 5 #Python 支持这样的表达式相当与 3<4 and 4 < 5
True
变量和赋值:
1、变量命名规则:以字母或者_开头,其它字符可以是数字、字母、下划线,命名大小写敏感
2、不需要预先申明变量的类型。
3、Python 不支持自增1和自减1操作符。
数字:
有符号整型 长整型 布尔值 浮点值 复数
int 0101 84 -234 0x80 014 -345 -0x92
long 238948349L -841401 oxDASLDKJFLJ
bool True False
float 3.1415926 4.2E-10 -90. 6.022e23 -1.89e-19
complex 6.23+1.5j -1.23-875j 0+1j
字符串:
1、用引号包裹,支持单引号(‘’)或者双引号(“”),三引号(三个连续的单引号或者双引号)可以用来包含特殊格式的字符;
2、使用索引操作符([])和切片操作符([:])可以得到子字符串,第一个字符索引为0,最后一个字符索引是-1。
3、加号 + 用于字符串连接运算,星号(*)用于字符串重复;
>>> iscool = 'is cool'
>>> pystr[0] #'p'
>>> pystr[2:5] #'tho' 不包含后面一位
>>> iscool[-1] # '!'
>>> pyshr + iscool # ‘python is cool!’
>>> pyshtr *2 #pythonpython
列表 和 元组
列表元素用中括号([])包裹,元素的个数及元素的值可以改变。元组元素用小括号(())包裹,不可以更改,元组是只读列表,通过切片运算([]和[:]) 可以得到子集
>>> aList[0] # 1
>>> aTuple = ('a','b','c','d')
>>> aTuple[:3] # ('a','b','c')
字典
字典是python中的映射数据类型,由键-值对构成,字典元素用大括号({})包裹,类似javascript 中的对象。
>>> aDict['port'] = 80 # add to dict
>>> aDict # {'host':'earth','port':80}
>>> aDict.keys() # ['host','port']
>>> aDict.values() # ['earth',80]
>>> for key in aDict:
print key,aDict[key] # 'host' 'earth' \n port 80
代码块及缩进:
python 通过缩进对齐来表达代码逻辑,而不是大括号。
if 语句 ( python 中的条件表达式不需要用括号括起来 )。结构如下:
if_suite
print "x 小于 0
其实在android中真正展示给用户的是window和view,activity在android中所其的作用主要是处理一些逻辑问题,比如生命周期的管理、建立窗口等。在android中,窗口的管理还是比较重要的一块,因为他直接负责把内容展示给用户,并和用户进行交互。响应用户的输入等。
在讲窗口管理时,有必要先说下ViewManager这个接口,这个接口主要有以下的实现子接口和实现类,分别是:WindowManager和ViewGroup里面还有三个重要的方法:
* addView();
* updateViewLayout();
* removeView();
在WindowManager中,addView方法表示的是将主窗口中的顶级view(也就是DecorView)添加到WindowManager中,并建立会话。接下来会详细介绍。我们先来看看Window
Window:
Window是android中的窗口,表示顶级窗口的意思,也就是主窗口,它有两个实现类,PhoneWindow和MidWindow,我们一般的activity对应的主要是PhoneWindow,在activity中经常使用的setContentView等方法也是在这个里面实现的。
@Override
public void setContentView(View view,ViewGroup.LayoutParams params) {
if (mContentParent == null) {
installDecor();
} else {
mContentParent.removeAllViews();
}
mContentParent.addView(view, params);
final Callback cb = getCallback();
if (cb != null) {
cb.onContentChanged(); //窗口类容发生变化时更新
}
}
每个主窗口中都有一个View,称之为DecorView,是主窗口中的顶级view(实际上就是ViewGroup),在View中有两个成员变量叫做mParent、mChildren,它是用来管理view的上下级关系的。而ViewGroup是对一组View的管理。因此,在ViewGroup中建立了所有view的关系网。而最终ViewGroup附属在主窗口上。这样就很容易在窗口中通过findViewById找到具体的View了。view中的事件处理也是根据这个路径来处理的。
我们再来看看ActivityThead中的两个重要的方法(至于ActivityThead将在一篇中详细介绍):
performLaunchActivity( );
handleResumeActivity( );
在performLaunchActivity中,会调用activity.attach方法建立一个window, 在handleResumeActivity方法中启动activity的时候,会将主窗口加入到WindowManager中
View decor =r.window.getDecorView(); //获得窗口的顶级View
decor.setVisibility(View.INVISIBLE);
ViewManager wm= a.getWindowManager(); //WindowManager继承自ViewManager
WindowManager.LayoutParams l =r.window.getAttributes();
a.mDecor = decor;
l.type =WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
l.softInputMode |= forwardBit;
if (a.mVisibleFromClient) {
a.mWindowAdded = true;
wm.addView(decor, l); //实际上是把主窗口的顶级view加入到WindowMangaer
&n