当前位置: 编程技术>移动开发
本页文章导读:
▪阿里地区投资穷游网加码线上旅游 密集投资备战IPO 阿里投资穷游网加码线上旅游 密集投资备战IPO
一淘网涉足旅游搜索余温未消,阿里巴巴昨日宣布,战略投资中文旅游资讯和在线增值服务提供商穷游网,在投资新浪微博后,阿里巴巴密集.........
▪ 写在20110912:中秋,onSaveInstanceState 写在20110912:中秋节,onSaveInstanceState
onSaveInstanceState()什么时候会被执行呢?1.当用户按下HOME键:系统不知道你按下HOME键后要运行多少其他的程序,自然也不知道activityA是否会被销毁,故.........
▪ GCC 编译施用动态链接库和静态链接库 GCC 编译使用动态链接库和静态链接库
1 库的分类根据链接时期的不同,库又有静态库和动态库之分。静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文.........
[1]阿里地区投资穷游网加码线上旅游 密集投资备战IPO
来源: 互联网 发布时间: 2014-02-18
阿里投资穷游网加码线上旅游 密集投资备战IPO
一淘网涉足旅游搜索余温未消,阿里巴巴昨日宣布,战略投资中文旅游资讯和在线增值服务提供商穷游网,在投资新浪微博后,阿里巴巴密集跑马圈地,被解读为备战IPO的系列举措之一。
从这两周内阿里在线上旅游的频繁落子不难看出,阿里巴巴对在线旅游领域的野心。波士顿咨询公司报告指出,到今年中国将超过日本成为全球第二大旅游市场,规模接近2万亿元。其中出境游市场增速将高于整体增速。“正因为目前在线旅游市场正在经历高增长,各家扔处于跑马圈地期间,线上旅游各细分市场尚未有某个网站有绝对压倒性优势。”易观智库分析师宋阳这样认为。
除了加码线上旅游业务外,昨日阿里巴巴的投资也被解读出另外一层含义:穷游网和阿里具备大数据整合的潜质,而且与其他旅游社区网站相比,穷游网目前不仅估值较低,还拥有日益壮大的白领海外游市场,而这正是阿里巴巴IPO所需要的。
今年,阿里巴巴资本运作不断,被看做为其IPO铺路之举。4月,阿里巴巴5.86亿美元购入新浪微博18%的股份,夺下媒体高地,并试水社会化电商;同月,阿里斥资8000万美元收购友盟,发力大数据战略;5月,阿里巴巴以2.94亿美元购入高德28%的股份,布局LBS领域;昨日对穷游网的投资,也在加码在线旅游领域的“社交化”属性。种种资本运作,阿里皆在扩充其“网购”之外的战略布局。
宋阳认为,在线旅游市场只是阿里关注的一个部分,其“LBS+O2O”业务布局越来越明晰,这无疑是在为企业上市估值做准备。“但是短时间内收购业内较多优秀的资源,能否很有效地整合这些优秀资源,是其面对的关键考验,也是对阿里高层的重要挑战。”
一淘网涉足旅游搜索余温未消,阿里巴巴昨日宣布,战略投资中文旅游资讯和在线增值服务提供商穷游网,在投资新浪微博后,阿里巴巴密集跑马圈地,被解读为备战IPO的系列举措之一。
从这两周内阿里在线上旅游的频繁落子不难看出,阿里巴巴对在线旅游领域的野心。波士顿咨询公司报告指出,到今年中国将超过日本成为全球第二大旅游市场,规模接近2万亿元。其中出境游市场增速将高于整体增速。“正因为目前在线旅游市场正在经历高增长,各家扔处于跑马圈地期间,线上旅游各细分市场尚未有某个网站有绝对压倒性优势。”易观智库分析师宋阳这样认为。
除了加码线上旅游业务外,昨日阿里巴巴的投资也被解读出另外一层含义:穷游网和阿里具备大数据整合的潜质,而且与其他旅游社区网站相比,穷游网目前不仅估值较低,还拥有日益壮大的白领海外游市场,而这正是阿里巴巴IPO所需要的。
今年,阿里巴巴资本运作不断,被看做为其IPO铺路之举。4月,阿里巴巴5.86亿美元购入新浪微博18%的股份,夺下媒体高地,并试水社会化电商;同月,阿里斥资8000万美元收购友盟,发力大数据战略;5月,阿里巴巴以2.94亿美元购入高德28%的股份,布局LBS领域;昨日对穷游网的投资,也在加码在线旅游领域的“社交化”属性。种种资本运作,阿里皆在扩充其“网购”之外的战略布局。
宋阳认为,在线旅游市场只是阿里关注的一个部分,其“LBS+O2O”业务布局越来越明晰,这无疑是在为企业上市估值做准备。“但是短时间内收购业内较多优秀的资源,能否很有效地整合这些优秀资源,是其面对的关键考验,也是对阿里高层的重要挑战。”
[2] 写在20110912:中秋,onSaveInstanceState
来源: 互联网 发布时间: 2014-02-18
写在20110912:中秋节,onSaveInstanceState
onSaveInstanceState()什么时候会被执行呢?
1.当用户按下HOME键:系统不知道你按下HOME键后要运行多少其他的程序,自然也不知道activityA是否会被销毁,故系统会调用onSaveInstanceState(),让用户有机会保存某些非永久性的数据。
2.长按HOME键:此时会弹出历史应用,选择运行其他的程序时。
3.按下电源键(解锁)时。
4.从ActivityA中启动一个新的Activity时。
5.屏幕方向切换时:在屏幕切换之前,系统会销毁ActivityA,在屏幕切换之后系统又会自动的创建ActivityA,所以onSaveInstanceState一定会被执行。
总而言之,onSaveInstanceState的调用遵循一个重要原则:当系统“未经许可”时销毁了你的Activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须提供一个机会让你保存你的数据。
onSaveInstanceState()什么时候会被执行呢?
1.当用户按下HOME键:系统不知道你按下HOME键后要运行多少其他的程序,自然也不知道activityA是否会被销毁,故系统会调用onSaveInstanceState(),让用户有机会保存某些非永久性的数据。
2.长按HOME键:此时会弹出历史应用,选择运行其他的程序时。
3.按下电源键(解锁)时。
4.从ActivityA中启动一个新的Activity时。
5.屏幕方向切换时:在屏幕切换之前,系统会销毁ActivityA,在屏幕切换之后系统又会自动的创建ActivityA,所以onSaveInstanceState一定会被执行。
总而言之,onSaveInstanceState的调用遵循一个重要原则:当系统“未经许可”时销毁了你的Activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须提供一个机会让你保存你的数据。
[3] GCC 编译施用动态链接库和静态链接库
来源: 互联网 发布时间: 2014-02-18
GCC 编译使用动态链接库和静态链接库
1 库的分类
根据链接时期的不同,库又有静态库和动态库之分。
静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。
有别于静态库,动态库的链接是在程序执行的时候被链接的。所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用。(TODO:链接动态库时链接阶段到底做了什么)
2 静态库和动态库的比较
链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代码而不是源码而已。因为静态库被链接后库就直接嵌入可执行文件中了,这样就带来了两个问题。
首先就是系统空间被浪费了。这是显而易见的,想象一下,如果多个程序链接了同一个库,则每一个生成的可执行文件就都会有一个库的副本,必然会浪费系统空间。
再者,人非圣贤,即使是精心调试的库,也难免会有错。一旦发现了库中有bug,挽救起来就比较麻烦了。必须一一把链接该库的程序找出来,然后重新编译。
而动态库的出现正弥补了静态库的以上弊端。因为动态库是在程序运行时被链接的,所以磁盘上只须保留一份副本,因此节约了磁盘空间。如果发现了bug或要升级也很简单,只要用新的库把原来的替换掉就行了。
那么,是不是静态库就一无是处了呢?
答曰:非也非也。不是有句话么:存在即是合理。静态库既然没有湮没在滔滔的历史长河中,就必然有它的用武之地。想象一下这样的情况:如果你用libpcap库编了一个程序,要给被人运行,而他的系统上没有装pcap库,该怎么解决呢?最简单的办法就是编译该程序时把所有要链接的库都链接它们的静态库,这样,就可以在别人的系统上直接运行该程序了。
所谓有得必有失,正因为动态库在程序运行时被链接,故程序的运行速度和链接静态库的版本相比必然会打折扣。然而瑕不掩瑜,动态库的不足相对于它带来的好处在现今硬件下简直是微不足道的,所以链接程序在链接时一般是优先链接动态库的,除非用-static参数指定链接静态库。
动态链接库
1. 创建动态链接库
[cpp] view plaincopy
#include<stdio.h>
void hello()
{
printf("hello world/n");
}
用命令gcc -shared hello.c -o libhello.so编译为动态库。可以看到,当前目录下多了一个文件libhello.so。
2. 再编辑一个测试文件test.c,内容如下
[cpp] view plaincopy
#include<stdio.h>
int main()
{
printf("call hello()");
hello();
}
编译 gcc test.c -lhello
-l 选项告诉编译器要使用hello这个库。奇怪的地方是动态库的名字是libhello.so,这里却使用hello.
但这样还不行,编译会出错。
In function `main':
test.c:(.text+0x1d): undefined reference to `hello'
collect2: ld returned 1 exit status
这是因为hello这个库在我们自己的路径中,编译器找不到。
需要使用-L选项,告诉hello库的位置
gcc test.c -lhello -L. -o test
-L .告诉编译器在当前目录中查找库文件
3. 编译成功后执行./test, 仍然出错
说找不到库
有两种方法:
一、可以把当前路径加入 /etc/ld.so.conf中然后运行ldconfig,或者以当前路径为参数运行ldconfig(要有root权限才行)。
二、把当前路径加入环境变量LD_LIBRARY_PATH中
当然,如果你觉得不会引起混乱的话,可以直接把该库拷入/lib,/usr/lib/等位置(无可避免,这样做也要有权限),这样链接器和加载器就都可以准确的找到该库了。
我们采用第二种方法:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
这样,再执行就成功了。
下面再讲讲静态链接库
仍使用刚才的hello.c和test.c。
1. gcc -c hello.c 注意这里没有使用-shared选项
2. 把目标文件归档 ar -r libhello.a hello.o
程序 ar 配合参数 -r 创建一个新库 libhello.a 并将命令行中列出的对象文件插入。采用这种方法,如果库不存在的话,参数 -r 将创建一个新的库,而如果库存在的话,将用新的模块替换原来的模块。
3. 在程序中链接静态库
gcc test.c -lhello -L. -static -o hello.static
或者 gcc test.c libhello.a -L. -o hello.static
生成的hello.static就不再依赖libhello.a了
两个有用的命令
file程序是用来判断文件类型的,在file命令下,所有文件都会原形毕露的。
顺便说一个技巧。有时在 windows下用浏览器下载tar.gz或tar.bz2文件,后缀名会变成奇怪的tar.tar,到Linux有些新手就不知怎么解压了。但 Linux下的文件类型并不受文件后缀名的影响,所以我们可以先用命令file xxx.tar.tar看一下文件类型,然后用tar加适当的参数解压。
另外,还可以借助程序ldd实用程序来判断。
ldd是用来打印目标程序(由命令行参数指定)所链接的所有动态库的信息的,如果目标程序没有链接动态库,则打印“not a dynamic executable”,ldd的用法请参考manpage。
1 库的分类
根据链接时期的不同,库又有静态库和动态库之分。
静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。
有别于静态库,动态库的链接是在程序执行的时候被链接的。所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用。(TODO:链接动态库时链接阶段到底做了什么)
2 静态库和动态库的比较
链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代码而不是源码而已。因为静态库被链接后库就直接嵌入可执行文件中了,这样就带来了两个问题。
首先就是系统空间被浪费了。这是显而易见的,想象一下,如果多个程序链接了同一个库,则每一个生成的可执行文件就都会有一个库的副本,必然会浪费系统空间。
再者,人非圣贤,即使是精心调试的库,也难免会有错。一旦发现了库中有bug,挽救起来就比较麻烦了。必须一一把链接该库的程序找出来,然后重新编译。
而动态库的出现正弥补了静态库的以上弊端。因为动态库是在程序运行时被链接的,所以磁盘上只须保留一份副本,因此节约了磁盘空间。如果发现了bug或要升级也很简单,只要用新的库把原来的替换掉就行了。
那么,是不是静态库就一无是处了呢?
答曰:非也非也。不是有句话么:存在即是合理。静态库既然没有湮没在滔滔的历史长河中,就必然有它的用武之地。想象一下这样的情况:如果你用libpcap库编了一个程序,要给被人运行,而他的系统上没有装pcap库,该怎么解决呢?最简单的办法就是编译该程序时把所有要链接的库都链接它们的静态库,这样,就可以在别人的系统上直接运行该程序了。
所谓有得必有失,正因为动态库在程序运行时被链接,故程序的运行速度和链接静态库的版本相比必然会打折扣。然而瑕不掩瑜,动态库的不足相对于它带来的好处在现今硬件下简直是微不足道的,所以链接程序在链接时一般是优先链接动态库的,除非用-static参数指定链接静态库。
动态链接库
1. 创建动态链接库
[cpp] view plaincopy
#include<stdio.h>
void hello()
{
printf("hello world/n");
}
用命令gcc -shared hello.c -o libhello.so编译为动态库。可以看到,当前目录下多了一个文件libhello.so。
2. 再编辑一个测试文件test.c,内容如下
[cpp] view plaincopy
#include<stdio.h>
int main()
{
printf("call hello()");
hello();
}
编译 gcc test.c -lhello
-l 选项告诉编译器要使用hello这个库。奇怪的地方是动态库的名字是libhello.so,这里却使用hello.
但这样还不行,编译会出错。
In function `main':
test.c:(.text+0x1d): undefined reference to `hello'
collect2: ld returned 1 exit status
这是因为hello这个库在我们自己的路径中,编译器找不到。
需要使用-L选项,告诉hello库的位置
gcc test.c -lhello -L. -o test
-L .告诉编译器在当前目录中查找库文件
3. 编译成功后执行./test, 仍然出错
说找不到库
有两种方法:
一、可以把当前路径加入 /etc/ld.so.conf中然后运行ldconfig,或者以当前路径为参数运行ldconfig(要有root权限才行)。
二、把当前路径加入环境变量LD_LIBRARY_PATH中
当然,如果你觉得不会引起混乱的话,可以直接把该库拷入/lib,/usr/lib/等位置(无可避免,这样做也要有权限),这样链接器和加载器就都可以准确的找到该库了。
我们采用第二种方法:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
这样,再执行就成功了。
下面再讲讲静态链接库
仍使用刚才的hello.c和test.c。
1. gcc -c hello.c 注意这里没有使用-shared选项
2. 把目标文件归档 ar -r libhello.a hello.o
程序 ar 配合参数 -r 创建一个新库 libhello.a 并将命令行中列出的对象文件插入。采用这种方法,如果库不存在的话,参数 -r 将创建一个新的库,而如果库存在的话,将用新的模块替换原来的模块。
3. 在程序中链接静态库
gcc test.c -lhello -L. -static -o hello.static
或者 gcc test.c libhello.a -L. -o hello.static
生成的hello.static就不再依赖libhello.a了
两个有用的命令
file程序是用来判断文件类型的,在file命令下,所有文件都会原形毕露的。
顺便说一个技巧。有时在 windows下用浏览器下载tar.gz或tar.bz2文件,后缀名会变成奇怪的tar.tar,到Linux有些新手就不知怎么解压了。但 Linux下的文件类型并不受文件后缀名的影响,所以我们可以先用命令file xxx.tar.tar看一下文件类型,然后用tar加适当的参数解压。
另外,还可以借助程序ldd实用程序来判断。
ldd是用来打印目标程序(由命令行参数指定)所链接的所有动态库的信息的,如果目标程序没有链接动态库,则打印“not a dynamic executable”,ldd的用法请参考manpage。
最新技术文章: