最近的项目需要使用UTD作为网络通信的底层库。之前已经通过Qt,顺利在Linux和Android环境下使用起来,想着应该应该可以用类似的方式修改一下编译器即可,但是做起来才发现里面有不少坑。现在写一下,防止以后忘记。
下面来说一下我做的步骤。
1. src/common.h文件中的pthread_t和pthread_key_t重定义问题。
因为 pthread_t和pthread_key_t在 mingw 4.8中已经有定义了,所以在 src/common.h 重新定义这两个类型时会报错。
#ifdef WIN32
// Windows compability
typedef HANDLE pthread_t;
typedef HANDLE pthread_mutex_t;
typedef HANDLE pthread_cond_t;
typedef DWORD pthread_key_t;
#endif
这里只需要在全文中搜索 pthread_t 和 pthread_key_t 将其替换个名字即可。我就将pthread_t 替换成pthread_t_vae,将替换成pthread_key_t_vae。
2.src/udt.h存在导入导出库环境的问题。
我用UDT的时候比较偷懒,没有将其导出成库,而仅仅只是将源文件导入到我的Qt工程里。在Linux中没什么问题,但是到了windows里就有问题了。
在 src/udt.h的84-88行存在如下定义:
#ifdef UDT_EXPORTS
#define UDT_API __declspec(dllexport)
#else
#define UDT_API __declspec(dllimport)
#endif
这个定义将会导致我无法给
class UDT_API CUDTException中的静态常量赋值。因为#define UDT_API __declspec(dllimport)的定义说明这个类是从外部导入的,但是我的代码是直接使用的源码,所以仅需把这个宏定义成空即可。
#ifdef UDT_EXPORTS
//#define UDT_API __declspec(dllexport)
#define UDT_API
#else
//#define UDT_API __declspec(dllimport)
#define UDT_API
#endif
在windows进行网络编程时,需要在加入相关的库。在Qt中加入库的方式比较简单,直接在Pro文件中加入如下定义即可。
win32-g++{
DEFINES += __MINGW__
LIBS += -lwsock32
LIBS += -lws2_32
CONFIG += qwt
include ( C:\Users\vae\work\build\libs\qwt\Qt5.3.1-pc-static\qwt-6.1.0\qwt.prf )
}
Ps:如果只使用UDT就只需要加入LIBS的内容就可以了,我还使用了qwt,所以有qwt的相关内容。