作者:朱金灿
来源:http://blog.csdn.net/clever101
zeromq是一个最近比较火的跨平台消息中间件,最近准备研究它,故下载它的源码编译了一下。我是使用VS2008编译的,下载下来在zeromq-4.1.2uildsmsvcvs2008目录下找到相应的解决方案文件。编译过程中有几个注意事项:
1. 出现1>e: estzeromq-4.1.2includezmq.h(78): fatal error C1083: 无法打开包括文件:“stdint.h”: No such file or directory
解决办法是:新建一个stdint.h,代码如下:
/* stdint.h standard header */ #ifndef _STD_INT #define _STD_INT #ifndef _STDINT #define _STDINT #ifndef RC_INVOKED #include <yvals.h> /* NB: assumes byte has 8 bits long is 32 bits pointer can convert to and from long long long long is longest type */ _C_STD_BEGIN /* TYPE DEFINITIONS */ typedef signed char int8_t; typedef short int16_t; typedef int int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef signed char int_least8_t; typedef short int_least16_t; typedef int int_least32_t; typedef unsigned char uint_least8_t; typedef unsigned short uint_least16_t; typedef unsigned int uint_least32_t; typedef char int_fast8_t; typedef int int_fast16_t; typedef int int_fast32_t; typedef unsigned char uint_fast8_t; typedef unsigned int uint_fast16_t; typedef unsigned int uint_fast32_t; #ifndef _INTPTR_T_DEFINED #define _INTPTR_T_DEFINED #ifdef _WIN64 typedef __int64 intptr_t; #else /* _WIN64 */ typedef _W64 int intptr_t; #endif /* _WIN64 */ #endif /* _INTPTR_T_DEFINED */ #ifndef _UINTPTR_T_DEFINED #define _UINTPTR_T_DEFINED #ifdef _WIN64 typedef unsigned __int64 uintptr_t; #else /* _WIN64 */ typedef _W64 unsigned int uintptr_t; #endif /* _WIN64 */ #endif /* _UINTPTR_T_DEFINED */ typedef _Longlong int64_t; typedef _ULonglong uint64_t; typedef _Longlong int_least64_t; typedef _ULonglong uint_least64_t; typedef _Longlong int_fast64_t; typedef _ULonglong uint_fast64_t; typedef _Longlong intmax_t; typedef _ULonglong uintmax_t; /* LIMIT MACROS */ #define INT8_MIN (-0x7f - _C2) #define INT16_MIN (-0x7fff - _C2) #define INT32_MIN (-0x7fffffff - _C2) #define INT8_MAX 0x7f #define INT16_MAX 0x7fff #define INT32_MAX 0x7fffffff #define UINT8_MAX 0xff #define UINT16_MAX 0xffff #define UINT32_MAX 0xffffffff #define INT_LEAST8_MIN (-0x7f - _C2) #define INT_LEAST16_MIN (-0x7fff - _C2) #define INT_LEAST32_MIN (-0x7fffffff - _C2) #define INT_LEAST8_MAX 0x7f #define INT_LEAST16_MAX 0x7fff #define INT_LEAST32_MAX 0x7fffffff #define UINT_LEAST8_MAX 0xff #define UINT_LEAST16_MAX 0xffff #define UINT_LEAST32_MAX 0xffffffff #define INT_FAST8_MIN (-0x7f - _C2) #define INT_FAST16_MIN (-0x7fff - _C2) #define INT_FAST32_MIN (-0x7fffffff - _C2) #define INT_FAST8_MAX 0x7f #define INT_FAST16_MAX 0x7fff #define INT_FAST32_MAX 0x7fffffff #define UINT_FAST8_MAX 0xff #define UINT_FAST16_MAX 0xffff #define UINT_FAST32_MAX 0xffffffff #if _INTPTR == 0 || _INTPTR == 1 #define INTPTR_MAX 0x7fffffff #define INTPTR_MIN (-INTPTR_MAX - _C2) #define UINTPTR_MAX 0xffffffff #else /* _INTPTR == 2 */ #define INTPTR_MIN (-_LLONG_MAX - _C2) #define INTPTR_MAX _LLONG_MAX #define UINTPTR_MAX _ULLONG_MAX #endif /* _INTPTR */ #define INT8_C(x) (x) #define INT16_C(x) (x) #define INT32_C(x) ((x) + (INT32_MAX - INT32_MAX)) #define UINT8_C(x) (x) #define UINT16_C(x) (x) #define UINT32_C(x) ((x) + (UINT32_MAX - UINT32_MAX)) #ifdef _WIN64 #define PTRDIFF_MIN INT64_MIN #define PTRDIFF_MAX INT64_MAX #else /* _WIN64 */ #define PTRDIFF_MIN INT32_MIN #define PTRDIFF_MAX INT32_MAX #endif /* _WIN64 */ #define SIG_ATOMIC_MIN INT32_MIN #define SIG_ATOMIC_MAX INT32_MAX #ifndef SIZE_MAX #ifdef _WIN64 #define SIZE_MAX UINT64_MAX #else /* _WIN64 */ #define SIZE_MAX UINT32_MAX #endif /* _WIN64 */ #endif /* SIZE_MAX */ //#define WCHAR_MIN 0x0000 #define WCHAR_MAX 0xffff #define WINT_MIN 0x0000 #define WINT_MAX 0xffff #define INT64_MIN (-0x7fffffffffffffff - _C2) #define INT64_MAX 0x7fffffffffffffff #define UINT64_MAX 0xffffffffffffffffU #define INT_LEAST64_MIN (-0x7fffffffffffffff - _C2) #define INT_LEAST64_MAX 0x7fffffffffffffff #define UINT_LEAST64_MAX 0xffffffffffffffffU #define INT_FAST64_MIN (-0x7fffffffffffffff - _C2) #define INT_FAST64_MAX 0x7fffffffffffffff #define UINT_FAST64_MAX 0xffffffffffffffffU #define INTMAX_MIN (-0x7fffffffffffffff - _C2) #define INTMAX_MAX 0x7fffffffffffffff #define UINTMAX_MAX 0xffffffffffffffffU #define INT64_C(x) ((x) + (INT64_MAX - INT64_MAX)) #define UINT64_C(x) ((x) + (UINT64_MAX - UINT64_MAX)) #define INTMAX_C(x) INT64_C(x) #define UINTMAX_C(x) UINT64_C(x) _C_STD_END #endif /* RC_INVOKED */ #endif /* _STDINT */ #if defined(_STD_USING) using _CSTD int8_t; using _CSTD int16_t; using _CSTD int32_t; using _CSTD int64_t; using _CSTD uint8_t; using _CSTD uint16_t; using _CSTD uint32_t; using _CSTD uint64_t; using _CSTD int_least8_t; using _CSTD int_least16_t; using _CSTD int_least32_t; using _CSTD int_least64_t; using _CSTD uint_least8_t; using _CSTD uint_least16_t; using _CSTD uint_least32_t; using _CSTD uint_least64_t; using _CSTD intmax_t; using _CSTD uintmax_t; using _CSTD uintptr_t; using _CSTD intptr_t; using _CSTD int_fast8_t; using _CSTD int_fast16_t; using _CSTD int_fast32_t; using _CSTD int_fast64_t; using _CSTD uint_fast8_t; using _CSTD uint_fast16_t; using _CSTD uint_fast32_t; using _CSTD uint_fast64_t; #endif /* defined(_STD_USING) */ #endif /* defined _STD_INT */
然后把它放到zeromq-4.1.2include目录下,然后在zeromq-4.1.2includezmq.h将
# include <stdint.h>改为# include "stdint.h",这样做是为了从本地目录开始查找头文件。
2. 1>e: estzeromq-4.1.2includestdint.h(17): error C2371: “int8_t”: 重定义;不同的基类型
1> e: estzeromq-4.1.2srcstdint.hpp(42): 参见“int8_t”的声明
解决办法:将zeromq-4.1.2srcstdint.hpp下的
#ifndef int8_t typedef __int8 int8_t; #endif #ifndef int16_t typedef __int16 int16_t; #endif
改为
//#ifndef int8_t //typedef __int8 int8_t; //#endif //#ifndef int16_t //typedef __int16 int16_t; //#endif
(就是全部注释掉)
3.编译出现1>session_base.obj : errorLNK2019: 无法解析的外部符号 "public: __thiscallzmq::socks_connecter_t::socks_connecter_t(class zmq::io_thread_t *,classzmq::session_base_t *,struct zmq::options_t const &,struct zmq::address_t*,struct zmq::address_t *,bool)"(??0socks_connecter_t@zmq@@QAE@PAVio_thread_t@1@PAVsession_base_t@1@ABUoptions_t@1@PAUaddress_t@1@3_N@Z),该符号在函数 "private: void __thiscallzmq::session_base_t::start_connecting(bool)"(?start_connecting@session_base_t@zmq@@AAEX_N@Z) 中被引用
1>../../../../lib/libzmq.dll: fatal error LNK1120: 1 个无法解析的外部命令
解决办法是:将zeromq-4.1.2src下面的全部cpp文件都添加进libzmq工程的SourceFiles的虚拟目录下。