如何使用IDE为Qt Creator编译器为mingw的方式编译RakNet。。。

    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,下面进入步骤:

  1. 打开 RakNet 目录下的 CMakeLists.txt 文件,找到第44行:
    set( RAKNET_INCLUDE_DIRS ${RAKNETHEADERFILES} ${RAKNET_INCLUDE_ONLY_DIR} PARENT_SCOPE )

    更改为:

    set( RAKNET_INCLUDE_DIRS ${RAKNETHEADERFILES} ${RAKNET_INCLUDE_ONLY_DIR} )
  2. 打开 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 ")
  3. 打开 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"" )

    删除这两行

  4. 打开 RakNet 目录下的 Source 目录下的 UDPForwarder.cpp ,找到第244行:
    && errno!=EWOULDBLOCK

    更改为:

    && errno!=WSAEWOULDBLOCK
  5. 打开 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.

原文地址:https://www.cnblogs.com/rozen/p/3929531.html