cairo 是一个免费的矢量绘图软件库,它可以绘制多种输出格式。cairo 支持许多平台,如 Linux、BSD、OSX等,当然,还有 Windows。
cairo 官网提供了在 windows 下的编译方法,详情可戳这里。尽管它给出了看起来很详细的步骤,但在实际编译中,你有可能会遇到各种各样的问题。
我们先从官网的步骤开始。
- 下载并编译 zlib .
- 下载并编译 libpng .
- 安装 MozillaBuild编译环境。( 注意安装路径下不要有空格) .
- 找到 MozillaBuild 的安装路径,找到 VC++ 对应版本的启动脚本,如 start-shell-msvc2015.bat,按官网给出的方式进行修改,定义出 zlib \ libpng 等 lib、include 等的路径 .
- 运行修改后的 bat,到 pixman 所在路径下,运行 make 命令进行编译 .
|
make -f Makefile.win32 CFG=release |
进行到这一步的时候,基本就无法进行下去了。因为在这一步开始就会出现各种各样的错误
下面我们将从这里开始,一步一步完成cairo的编译。
1. 修改MozillaBuild脚本:
- 打开 VS 版本对应的 bat 文件,注意 MOZ_MSVCBITS 的值 :这里将值改为 32。我们将编译 32 位版本。
- 打开 start-shell.bat 。在 "REM Reset some env vars and set some others." 内容下方,按照官网上给出的方式,指定 zlib, libpng 的 lib 和 include 所在路径。
- 如果你的PC是 64 位,那么 MozillaBuild 会默认使用 64 的 VS 进行编译,可能会引发平台不匹配的问题。此时需要将 "REM Prepend MSVC paths." 下面的
|
SET TOOLCHAIN=64-bit cross-compile |
改为
|
SET TOOLCHAIN=32-bit cross-compile |
2. 修改 pixman-version.h.in
进入 pixman/pixman 文件夹下,修改 @PIXMAN_VERSION_MAJOR@ , @PIXMAN_VERSION_MINOR@ , @PIXMAN_VERSION_MICRO@ 的值为对应的版本号。
这里有一份修改好的文件,版本号为 0.35.1 ,可直接取用
|
git clone https://git.oschina.net/wandoer/pixmanversionheader.git |
3. 编译pixman
运行 start-shell-msvc2015.bat ,转到 pixman 路径下,运行
|
make -f Makefile.win32 CFG=release |
如果成功,则 pixman/pixman 路径下有 release 文件夹,内有 pixman-1.lib
4. 修改Makefile.win32.common
在 cairo/build/ 路径下找到 Makefile.win32.common 文件,指定 zlib 和 libpng 所在的路径( ZLIB_PATH 和 LIBPNG_PATH)。
修改 zdll.lib 为 zlib.lib。
5. 编译 cairo
转到 cairo/ 路径下运行命令:
|
make -f Makefile.win32 CFG=release |
如不出意外,此步应编译成功
6. 提取 include 头文件
在 cairo/ 路径下,添加以下脚本并执行:
|
mkdir -vp include cp ./src/cairo-features.h include/ cp ./src/cairo.h include/ cp ./src/cairo-deprecated.h include/ cp ./src/cairo-win32.h include/ cp ./src/cairo-script.h include/ cp ./src/cairo-ps.h include/ cp ./src/cairo-pdf.h include/ cp ./src/cairo-svg.h include/ cp ./cairo-version.h include/ |
至此,cairo 的编译已经完成。
一、类声明
Objective-C并没有像其他面向对象语言那样提供声明类的专用关键字或者语法,而是用编译处理指令来实现,特征是类声明语句都须以@符号开始
类声明的编译处理指令以 @interface 开始,以 @end 结尾,在这之间代码便是类属性和方法的声明。
|
@interface 类名 : 父类名 属性声明 实例方法声明 类方法声明 @end |
属性声明
属性是获取和(或)设置类实例状态的接口。
语法如下:
|
@property (可选特性) 属性类型 属性名称 |
//TODO 属性的特性可以设置属性的存储主义和其他行为。
方法声明
语法如下:
|
方法类型 (返回值类型) 方法名部分1:(参数类型1)参数名1 方法名部分2:(参数类型2)参数名2 ...; |
例如:
|
- (void) setpointX:(int)x andY:(int)y; |
- 方法类型 -表示该方法为实例方法 +表示该方法为类方法
- 返回值类型和参数类型放入()中
- C函数返回值缺省为int型。OC中缺省参数为id型的对象类型。
- 习惯上类名首字母大写,方法名全部小写。
二、类实现
类的实现要在@implementation这个编译处理指令中进行
|
@implementation 类名 { 变量声明 } 属性定义 实例方法定义 @end |
变量声明
类的实例变量可以在类的接口或实现部分中声明。不过在类的公有接口中声明变量违反了OOP的特性之一—封装。所以最好在类的实现部分声明实例变量。类可以没有实例变量,这时{}可以忽略。
Object-C提供多种编译器指令设置变量的作用范围(即变量的访问控制):
- private: 只能在声明它的类中被访问
- protected: 只能在声明它的类以及其子类中被访问
- public: 可以被任意代码访问(这会违反类的封装原则)
- package: 可以被同一个包内的其它类实例或函数访问。这种作用范围通常用于库或框架类。
当用变量保存对象的时候,应该始终使用指针类型。Objective-C对变量包含的对象支持强弱两种类型。强类型指针的变量类型声明包含了类名。弱类型指针使用id作为对象的类型。弱类型指针常用于类的集合,在集合中对象精确的类型可以是未知的。
属性定义
在大多数情况下,属性是由变量支持的,所以,属性定义中会含有属性的getter,setter方法的定义、变量的声明,并在getter/setter方法中使用这个变量。OC提供了多种定义属性的方式:显式定义、关键字补全、自动补全。
- 显式定义: 在相应的代码中明确定义属性的访问器(getter,setter)方法。
- 关键字补全: 通过使用@synthesize关键字,可以使编译器自动生成属性定义。属性代码会在相应的类实现部分自动补全。
- 自动补全: Clang/LLVM(4.2+)是苹果公司推荐使用的OC编译器,他支持对已声明的属性进行自动补全。这意味着编译器可以自动补全以下已声明的属性:没有使用关键字(如@synthesize)进行代码补全的属性、不是通过@dynamic指令自动生成的属性。 编译器会自动补全已声明的方法和相应的变量。
继续阅读
单位使用的是有线局域网络,通过单位路由连接公网。同时配备了一个VPN无线网络用作平时翻墙用。但是在连接到无线VPN网络以后,需要断开本地网络才能够上网;断开VPN网络后需要再次连接本地网络才能上网。太麻烦了。故写一个脚本来配置网络。主要使用 netsh 命令
脚本:
|
netsh wlan connect name=vpn netsh interface set interface name="本地连接" admin=DISABLE |
这里的“vpn”指无线网配置文件,通过下面的方法导出:
连接到VPN,并导出配置文件
|
netsh wlan export profile name="<wireless_name>" folder="<path>" |
wireless_name 可以为无线网 SSID。
注意使用 admin 参数时需要有管理员权限。(脚本文件使用管理员权限运行)
在firefox上配置goagent。安装porxy时出现firefox插件无法下载的问题(there was an error downloading)。可能是由于firefox插件的服务被墙了。通过修改Host让Firefox可以访问插件服务即可。
10.144.15.236 oscp.digicert.com
Linux下修改 /etc/hosts 文件,重新启动networking
Windows下修改 C:\Windows\System32\drivers\etc\hosts文件
http://www.blogguy.cn/show-835-1.html
Android开发时,在AndroidManifest.xml中指定特定的权限
如下,指明程序有访问网络和写扩展存储(SDCARD)的权限.
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
libcurl 7.52.0 编译 OpenSSL 依赖。
1.使用如下目录结构
|
somedirectory\ |_curl-src | |_winbuild | |_deps |_ lib |_ include |_ bin |
2.将 OpenSSL 的 lib,dll,头文件(带openssl文件夹) 分别拷贝到 deps 路径的 lib,bin,include 目录下
3. 进入 winbuild 目录。
|
nmake /f Makefile.vc mode=dll WITH_SSL=dll ENABLE_WINSSL=no |
编译正确。但是在链接阶段出现 openssl.obj 中的某些符号无法链接:
|
openssl.obj : error LNK2019: 无法解析的外部符号 _OpenSSL_version_num,该符号在函数 _Curl_ossl_version 中被引用 openssl.obj : error LNK2019: 无法解析的外部符号 _EVP_PKEY_get0_RSA,该符号在函数 _get_cert_chain 中被引用 openssl.obj : error LNK2019: 无法解析的外部符号 _EVP_PKEY_get0_DSA,该符号在函数 _get_cert_chain 中被引用 openssl.obj : error LNK2019: 无法解析的外部符号 _EVP_PKEY_get0_DH,该符号在函数 _get_cert_chain 中被引用 openssl.obj : error LNK2019: 无法解析的外部符号 _RSA_get0_key,该符号在函数 _get_cert_chain 中被引用 openssl.obj : error LNK2019: 无法解析的外部符号 _RSA_get0_factors,该符号在函数 _get_cert_chain 中被引用 openssl.obj : error LNK2019: 无法解析的外部符号 _RSA_get0_crt_params,该符号在函数 _get_cert_chain 中被引用 openssl.obj : error LNK2019: 无法解析的外部符号 _DH_get0_pqg,该符号在函数 _get_cert_chain 中被引用 openssl.obj : error LNK2019: 无法解析的外部符号 _DH_get0_key,该符号在函数 _get_cert_chain 中被引用 openssl.obj : error LNK2019: 无法解析的外部符号 _DSA_get0_pqg,该符号在函数 _get_cert_chain 中被引用 openssl.obj : error LNK2019: 无法解析的外部符号 _DSA_get0_key,该符号在函数 _get_cert_chain 中被引用 openssl.obj : error LNK2019: 无法解析的外部符号 _X509_get_version,该符号在函数 _get_cert_chain 中被引用 openssl.obj : error LNK2019: 无法解析的外部符号 _X509_get_X509_PUBKEY,该符号在函数 _pkp_pin_peer_pubkey 中被引用 openssl.obj : error LNK2019: 无法解析的外部符号 _X509_get0_extensions,该符号在函数 _get_cert_chain 中被引用 openssl.obj : error LNK2019: 无法解析的外部符号 _SSL_CTX_set_options,该符号在函数 _ossl_connect_step1 中被引用 openssl.obj : error LNK2019: 无法解析的外部符号 _TLS_client_method,该符号在函数 _ossl_connect_step1 中被引用 |
检查 libcurl\lib\vtls\openssl.c 文件,发现这些符号都与 OPENSSL_VERSION_NUMBER 宏有关。这个宏在 openssl的头文件 opensslv.h 中定义。
在 libcurl\lib\vtls\openssl.h 中添加 opensslv.h 引用,重新编译,可解决此问题。