RakNet是什么,这一点不在本文中说明,或许我会另开随笔说明,你也可以搜索一下它。以下的说明将假定你有一定的编程基础,不针对初学者讲解。
另:该说明只针对 Windows 32位平台,其它平台没有验证过下列步骤的准确性。
RakNet当前版本提供的主要是 VS 的项目文件以及还有 XCODE 的,但我主要想在mingw版本的Qt中使用它,因此有了此文的诞生。很幸运的一点是,它至少提供了CMakeLists.txt 。
为什么使用了Qt Creator,因为它可以直接使用CMakeLists.txt做为项目文件而创建一个可编译的项目版本。你也可以直接使用CMake来处理CMakeLists.txt,但是我懒所以我选择了 Creator 。
这里有一个要点,你需要一定版本的Creator才能做到上述行为,且需要在 Creator 的编译工具链中正确添加了 mingw 编译器路径以及设置了 CMake 路径,CMake需要2.6以上的版本。关于这点,同样不在本文中说明。
RakNet解压准备Ok,Creator、mingw、CMake准备OK,下面进入步骤:
- 打开 RakNet 目录下的 CMakeLists.txt 文件,找到第44行:
set( RAKNET_INCLUDE_DIRS ${RAKNETHEADERFILES} ${RAKNET_INCLUDE_ONLY_DIR} PARENT_SCOPE )
更改为:
set( RAKNET_INCLUDE_DIRS ${RAKNETHEADERFILES} ${RAKNET_INCLUDE_ONLY_DIR} )
- 打开 RakNet 目录下的 LibDLL 目录下的 CMakeLists.txt 文件,它是生成动态链接库的,找到第13行:
SET( CMAKE_CXX_FLAGS "/D WIN32 /D _RAKNET_DLL /D _CRT_NONSTDC_NO_DEPRECATE /D _CRT_SECURE_NO_DEPRECATE /GS- /GR- ")
更改为:
SET( CMAKE_CXX_FLAGS "-D WIN32 -D _RAKNET_DLL -D _CRT_NONSTDC_NO_DEPRECATE -D _CRT_SECURE_NO_DEPRECATE ")
- 打开 RakNet 目录下的 LibLibStatic 目录下的 CMakeLists.txt 文件,它是生成静态链接库的,找到第12行:
SET( CMAKE_CXX_FLAGS "/D WIN32 /D _RAKNET_LIB /D _CRT_NONSTDC_NO_DEPRECATE /D _CRT_SECURE_NO_DEPRECATE /GS- /GR- ")
更改为:
SET( CMAKE_CXX_FLAGS "-D WIN32 -D _RAKNET_LIB -D _CRT_NONSTDC_NO_DEPRECATE -D _CRT_SECURE_NO_DEPRECATE ")
找到第22、23行:
ELSE() set_target_properties(RakNetLibStatic PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB:"LIBCD.lib LIBCMTD.lib MSVCRT.lib"" )
删除这两行
- 打开 RakNet 目录下的 Source 目录下的 UDPForwarder.cpp ,找到第244行:
&& errno!=EWOULDBLOCK
更改为:
&& errno!=WSAEWOULDBLOCK
- 打开 RakNet 目录下的 Source 目录下的 DR_SHA1.h ,找到第172行:
#define TCHAR char
更改为:
#include <tchar.h>
Ok ,点下“构建项目”的按钮,开始祈祷吧!
经过一段不算长的时间等待,除了少许字符类型警告外,RakNet 已经成功编译出了mingw下的静态库:“libRakNetLibStatic.a”,动态库:“libRakNetDLL.dll、libRakNetDLL.dll.a” 。
我使用以下代码进行简单测试:
#include "MessageIdentifiers.h" #include "RakPeerInterface.h" #include "RakNetStatistics.h" #include "RakNetDefines.h" #include "RakNetTypes.h" int main(int argc, char *argv[]) { RakNet::RakPeerInterface *server = RakNet::RakPeerInterface::GetInstance(); RakNet::RakPeerInterface::DestroyInstance(server); return 0; }
结果静态库编译报错,但动态库是能正常使用的。期望有闲又有兴趣的童鞋能试一试,尝试解决下静态库的问题。
The end.