• 如何使用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.

  • 相关阅读:
    WEB前端开发规范文档
    js九九乘法表
    阿里前端两年随想
    自动播放选项卡
    HTML+CSS编写规范
    简易秒表
    关于响应式布局
    关于PHP语言
    关于CSS3的小知识点之2D变换
    关于H5框架之Bootstrap的小知识
  • 原文地址:https://www.cnblogs.com/rozen/p/3929531.html
Copyright © 2020-2023  润新知