TimothyQiu's Blog

keep it simple stupid

MinGW 下编译 libcurl

分类:技术

libcurl 是鼎鼎大名的开源客户端 URL 传输库,支持 FTP、HTTP 以及其它很多乱七八糟的协议。在各种语言上的实现也很多:C、C++、Lua、Java、Pascal、Perl、PHP、Python、Ruby、Visual Basic……。这里说最常用的 C 语言实现,环境是 Windows 7 + MinGW32。

下载 libcurl 源代码

libcurl 可以在官网 http://curl.haxx.se/ 获得。Download 页有源代码和为各平台预编译的二进制文件(curl 程序)和开发包(include + lib + doc)下载。不过我想要的 MinGW32 开发包的链接失效了 = = 就下载个源代码包自己编译吧。

在 Download 页的 Source Archives 栏里有最新的 curl 7.27.0 版本源代码压缩包,下载 curl-7.27.0.zip 文件。

编译 libcurl 库

  1. 解压 curl-7.27.0.zip 文件
  2. 通过命令提示符进入 curl-7.27.0 文件夹
  3. 输入 mingw32-make mingw32 进行生成(这里我只需要普通的功能,于是没有加附加的选项)

编译完成后,在 lib 文件夹中会有我们需要的三个文件。

接下来,可以进入 docs/examples 文件夹,测试编译一些示例程序。可以直接用 Makefile.m32 文件,也可以手动一个个用 gcc 编译。

动态链接:

gcc -I../../include -L../../lib simple.c -lcurldll 

静态链接:

gcc -I../../include -L../../lib simple.c -DCURL_STATICLIB -lcurl -lws2_32 -lwldap32 

动态链接编译出的程序运行时依赖 libcurl.dll。静态链接参数中的 ws2_32 是 Windows Socket 2 库,wldap32 是微软的 Lightweight Directory Access Protocol API 库。

一般使用流程

基本的 curl 程序主要分四步:

  1. curl_easy_init 创建 CURL 对象
  2. curl_easy_setopt 设置操作选项
  3. curl_easy_perform 进行操作
  4. curl_easy_cleanup 销毁 CURL 对象

最简单的示例可以看 doc/examples 下的 simple.c 文件,演示如何将 curl 主页内容输出到 stdout。

MinGW 下编译 freeglut

分类:技术

于是国庆一时兴起决定折腾下 OpenGL 玩玩。

本自然段纯吐槽,欢迎略过:学习 OpenGL 的一大幸事是有诸如 NeHe 这样的大神级教程可以参考,可惜开篇光讲怎么在 Win32 下创建空窗口就讲了洋洋洒洒 14 屏。Win32 API 创建窗口不是问题,问题是一来光空窗口就要这么长的篇幅我实在看不下去,二来他木有讲 Linux 版本的(不过示例代码有 Linux 版本下载)。要说创建窗口什么的简洁和跨平台方便还是 GLUT,而且碰巧 Google 到了 GLUTによる「手抜き」OpenGL入門 这篇,不愧是大学的讲义(?),质量非常不错。GLUT 本身貌似决定停留在这个世纪初了,于是改用 freeglut。Arch 下安装 freeglut 直接 pacman -S freeglut 即可,Windows 下就只得自己下载源码编译了。

README.cygwin_mingw 自带了一段 makefile,不过看起来还是手动 gcc 来得方便。

生成动态链接库

下载最新稳定版本源代码并解压后进入 src 目录,执行:

gcc -O2 -c -DFREEGLUT_EXPORTS *.c -I../include
gcc -shared -o freeglut.dll *.o -Wl,--enable-stdcall-fixup,--out-implib,libfreeglutdll.a -lopengl32 -lglu32 -lgdi32 -lwinmm

生成静态链接库

还是 src 目录,执行:

gcc -O2 -c -DFREEGLUT_STATIC *.c -I../include
ar rcs libfreeglut.a *.o

至此,freeglut 就编译好了。

最后可以把 include/GL 里的头文件扔进 MinGW 的 include/GL 文件夹,libfreeglut.a 和 libfreeglutdll.a 扔进 MinGW 的 lib 文件夹, freeglut.dll 扔进 MinGW 的 bin 文件夹方便使用。

p.s. 最初我是把 libfreeglutdll.a 命名成 libfreeglut.dll.a 的,结果静态链接的时候 -lfreeglut 似乎老是选择 libfreeglut.dll.a 而不是 libfreeglut.a,完全不知道为什么。不过反正 libfreeglutdll.a 也是 freeglut 的 README 里推荐的名字,罢了。