1. 程式人生 > >使用 MinGW 編譯 ZeroMQ 靜態庫

使用 MinGW 編譯 ZeroMQ 靜態庫

最近折騰zeromq,嘗試用 MinGW 來編譯了一下。

根據 http://zeromq.org/build:mingw 的說明,用MinGW來編譯 ZeroMQ 自然是沒有問題的。但是業餘測試一些簡單的程式碼還是用靜態庫比較方便。怎奈何,預設的 configure 檔案根本不支援用 MinGW 編譯靜態庫。

“configure: error: Building static libraries is not supported under MinGW32”

但是誰能限制不安分的程式猿呢。預設不支援不打緊,直接呼叫編譯器來完成就是了。其他很多庫也是這麼擼出來的吧。


cd /path/to/zeromq-4.0.4
mkdir builds/mingw32
cp -vf builds/msvc/platform.hpp builds/mingw32
g++ -DZMQ_STATIC -DFD_SETSIZE=1024 -c ../../src/*.cpp
ar r libzmq.a *.o

遇到的一個嚴重問題是

..\..\src\windows.hpp:168:21: fatal error: Mstcpip.h: No such file or directory
 #include <Mstcpip.h>
                     ^
compilation terminated.

自己用的 MinGW 版本里沒有 mstcpip.h 檔案。放狗搜了下,在 cgminer 的編譯說明裡找到了解決方案。

自行新增標頭檔案 mstcpip.h:

struct tcp_keepalive
{
    u_long onoff;
    u_long keepalivetime;
    u_long keepaliveinterval;
};

#ifndef USE_WS_PREFIX

#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR, 4)

#else

#define WS_SIO_KEEPALIVE_VALS _WSAIOW(WS_IOC_VENDOR, 4)

#endif


下面編譯一下hello world吧。

#include <stdio.h>

#include "zmq.h"


int main(int argc, char **argv)
{
    int major, minor, patch;
    zmq_version (&major, &minor, &patch);
    printf ("Current 0MQ version is %d.%d.%d\n", major, minor, patch);

    return 0;
}
gcc -c -o hello_zeromq.o hello_zeromq.c -g -I"../../inc" -I"../../../include/zeromq" -DZMQ_STATIC -I"../../inc" -I"../../../include/zeromq"
g++ -o hello_zeromq.exe hello_zeromq.o  -L"../../lib" -L"../../../lib" -lzmq -lws2_32

執行結果:
./hello_zeromq.exe
Current 0MQ version is 4.0.4

第一步順利完成,下面就需要進行修煉,編寫需要的解決方案了。