如题

https://github.com/bbqz007/cpprestsdk4mingw

移植过程解决的问题,下面列出其中一些问题:

1. mingw对#pragma once支持不好。

须要在所有包含asio/ssl.h的文件,并在这行之前添加C_ASSERT宏定义。

2. mingw对dll中的类的内联虚函数支持不好。

cpprestsdk.dll被链接会报错undefined reference to `vtable for,

须要将所有内联的虚函数导出,并在源文件实现,编译进cpprestsdk.dll。

2. mingw对dll的不完整导出的带虚函数的类支持不好。

不要取消构造或析构函数的内联,在dll内实现,即让这样函数在dll内访问vtable。

3. winnt.h让非VC用户体验不好,在非_MSC_VER下的C_ASSERT不支持类成员,因为这个分支的C_ASSERT是一个extern函数类型。

修改winnt.h,添加分支条件为#if defined(_MSC_VER) || defined(MINGW)。

4. mingw对VC异常指令__try, __except不支持。

自行修改源文件,添加新分支#ifdef MINGW,使用try,catch语法。

5. mingw对VC的_ReturnAddress指令不支持。

6. mingw的libcrypt32.a缺少对符号CryptProtectMemory支持。

须要直接链接到%systemroot%/crypt32.dll。

7. mingw对posix的pread, pwrite不支持。

如果CPPREST_FILEIO_IMPL指定为posix,要手动添加io.h, fcntl.h等头文件,并实现pread, pwrite。

如果 CPPREST_FILEIO_IMPL指定为win,要手动添加-lmsvcr*。

8. mingw对msvcr*的支持,但要手动修改。

例如一些会对wchar_t的crt函数,或者带_l,_s后缀的crt函数,要手动添加-lmsvcr*。

有些函数可以自己去实现或加一层包装,但是有些则不行,如_create_locale, _free_locale。

8.1 msvcrt是vc6.0,高版vc对应mscvrXX,但是要小心,需要manifest文件。

没有manifest文件,运行期报两类错。程序尝试不正确加载c运行库,或者80000003。

https://www.cnblogs.com/JesseFang/p/3991832.html

https://sourceforge.net/p/mingw/bugs/2014/

https://stackoverflow.com/questions/3402252/how-to-link-against-msvcr90-dll-with-mingw-gcc

另外应用程序要链接到-lgcc。

9. mingw对winsock支持。

须要手动添加-lws2_32.h对应winsock的启动,-lmswsock对应带Ex的扩展版函数。

10. mingw对win32原子指令函数支持。

须要手动添加<intrin.h>。

11. mingw对winhttp,  winsys版本支持不好。

在cmake配置中,指定CPPREST_HTTP_CLIENT_IMPL还有CPPREST_HTTP_LISTENER_IMPL为asio。

12. PPLX_IMPL为win时,不包含pplx.cpp。

在cmake配置中,指定CPPREST_PPLX_IMPL为winpplx。

13. enable_if_t需要c++14

须要手动指定c++14,默认为c++11

14. mingw不支持内联的__declspec(dllimport)

fileio.h中的函数都以_ASYNCRTIMP声明并定义,也就是内联了。这些函数没有编译进cpprestsdk.dll,mingw并不支持内联方式的__declspec(dllimport)。

15. mingw不支持一个有dllexport虚函数的类的构造析构函数内联

这些类的构造析构函数须要编译进动态库并dllexport。否则内联到你的代码的这些函数在链接时就会报错undefined reference to `vtable for。

16. msvcrNN.dll

_create_locale, _free_locale,依赖同版本的msvcrNN.dll。

要用windres将manifest编译进cpprestsdk.dll

error: Winsock.h has alread been include 在包含winodws.h前定义宏WIN32_LEAN_AND_MEAN,表明不包含一些极少使用的偏门的资料。使用winsock2.h。

cpprestsdk移植到mingw,项目上传至github的更多相关文章

  1. 如何通过Git GUI将自己本地的项目上传至Github

    最近在学习node.js和react,顺便复习了下AngluarJS相关的东西,写了些小demo想放在GitHub上,之前仅限于只申请了GitHub账号从没用过,今天花半天时间查资料认真学习Githu ...

  2. 将本地项目上传到Github

    将本地项目上传到Github 转载请注明出自天外归云的博客. 前提 已经下载了Git到本地. 创建Repository 首先登陆我的Github页面,在Repositories中New一个并起Repo ...

  3. mac下安装git,并将本地的项目上传到github

    mac下安装git 安装过程: 1.下载Git installer http://git-scm.com/downloads 2.下载之后打开,双击.pkg安装 3.打开终端,使用git --vers ...

  4. 详细教程:将本地项目上传到github

    作为 一个工程师,将本地项目上传到github进行备份和分享是一个不错的技能,一来可以方便以后的工作,二来可以分享自己的成果.所以下面本人详细教大家如何将本地项目上传到github,十分简单,一学就会 ...

  5. Git的使用-如何将本地项目上传到Github

    默认你的电脑上已经安装了git. 第一步:我们需要先创建一个本地的版本库(其实也就是一个文件夹). 你可以直接右击新建文件夹,也可以右击打开Git bash命令行窗口通过命令来创建. 现在我通过命令行 ...

  6. 如何用命令将本地项目上传到github

    一.Git终端软件安装 1.下载windows上git终端,类似shell工具,下载地址:http://msysgit.github.io/ 2.安装方法,打开文件,一路点击Next即可 3.安装完成 ...

  7. 使用 vscode将本地项目上传到github以及删除github上的某个文件夹

    安装Git后,可以看到windows环境下有两个命令输入窗口Git CMD 和Git Bash Git GUI是可视化图形界面 Git中的Bash是基于CMD的,在CMD的基础上增添一些新的命令与功能 ...

  8. 如何通过TortoiseGit(小乌龟)把本地项目上传到github上

    1.第一步: 安装git for windows(链接:https://gitforwindows.org/)一路next就好了, 如果遇到什么问题可以参考我另外一篇文章~^ - ^ 2.第二步:安装 ...

  9. 如何将项目上传到GitHub?

    如何将项目上传到GitHub? 1.注册GitHub账户 浏览器输入GitHub官网地址:https://github.com/ 进入后点击Sign In 然后点击Create an account ...

  10. Git的使用--如何将本地项目上传到Github(三种简单、方便的方法)

    一.第一种方法: 1.首先你需要一个github账号,所以还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下载地址,下载后一路(傻瓜式安装) ...

随机推荐

  1. Java-将Oracle中某个表的数据导出成数据文件

    在做数据开发或者ETL工作中,经常会遇到需要在客户端将Oracle数据库中的某些表的数据导出,提供给其他人员使用的情况.      下面介绍我之前实施的一种方法:(该方法不是最好的办法,但是可以勉强使 ...

  2. JS leetcode 杨辉三角Ⅱ 题解分析

    壹 ❀ 引 今天是的题目来自leetcode的119. 杨辉三角 II,还记得几天前,我第一次遇到118. 杨辉三角,一段代码调试半天写不出来,这次遇到升级版终于开开心心快快乐乐轻松解题,题目描述如下 ...

  3. NC23482 小A的最短路

    题目链接 题目 题目描述 小A这次来到一个景区去旅游,景区里面有N个景点,景点之间有N-1条路径.小A从当前的一个景点移动到下一个景点需要消耗一点的体力值.但是景区里面有两个景点比较特殊,它们之间是可 ...

  4. SATA学习笔记——Transport Layer 概述

    一.故事前传 在之前的文章中,我们有提到SATA主要包括:应用层(Application Layer), 传输层(Transport Layer),链路层(Link Layer)以及物理层(Physi ...

  5. AIR32F103(十二) 搭载 AIR32F103CBT6 的Bluepill核心板

    目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...

  6. 欧拉公式 Euler's Formula

    欧拉公式是数学中最重要的公式之一, 它涉及到了复数, 无理数, 三角函数, 简单优美 \(e^{i\theta} = cos(\theta) + isin(\theta)\) 欧拉公式代表的含义并不是 ...

  7. 【Unity3D】半球卷屏特效

    1 原理 ​ 凸镜贴图 和 渐变凸镜贴图 中介绍了使用 OpenGL 实现凸镜贴图及其原理,通过顶点坐标映射到纹理坐标,并构造三角形网格,构建了真正的三维凸镜模型.本文通过 Shader 实现半球卷屏 ...

  8. 【Unity3D】基于深度和法线纹理的边缘检测方法

    1 前言 ​ 边缘检测特效中使用屏后处理技术,通过卷积运算计算梯度,检测每个像素周围像素的亮度差异,以识别是否是边缘像素:选中物体描边特效中也使用了屏后处理技术,通过 CommandBuffer 获取 ...

  9. Vuex和普通全局对象

    Vuex中的核心方法 Vuex是一个专为Vue.js应用程序开发的状态管理模式,其采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.每一个Vuex应用的核心就是 ...

  10. Oracle SQL 注入攻击

    All about Security - SQL Injection 最近做个一个有关ORACLE数据库安全的网上研讨.我们有1300多位参与者,反馈相当丰富. I recently did a we ...