cpprestsdk移植到mingw,项目上传至github
如题
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的更多相关文章
- 如何通过Git GUI将自己本地的项目上传至Github
最近在学习node.js和react,顺便复习了下AngluarJS相关的东西,写了些小demo想放在GitHub上,之前仅限于只申请了GitHub账号从没用过,今天花半天时间查资料认真学习Githu ...
- 将本地项目上传到Github
将本地项目上传到Github 转载请注明出自天外归云的博客. 前提 已经下载了Git到本地. 创建Repository 首先登陆我的Github页面,在Repositories中New一个并起Repo ...
- mac下安装git,并将本地的项目上传到github
mac下安装git 安装过程: 1.下载Git installer http://git-scm.com/downloads 2.下载之后打开,双击.pkg安装 3.打开终端,使用git --vers ...
- 详细教程:将本地项目上传到github
作为 一个工程师,将本地项目上传到github进行备份和分享是一个不错的技能,一来可以方便以后的工作,二来可以分享自己的成果.所以下面本人详细教大家如何将本地项目上传到github,十分简单,一学就会 ...
- Git的使用-如何将本地项目上传到Github
默认你的电脑上已经安装了git. 第一步:我们需要先创建一个本地的版本库(其实也就是一个文件夹). 你可以直接右击新建文件夹,也可以右击打开Git bash命令行窗口通过命令来创建. 现在我通过命令行 ...
- 如何用命令将本地项目上传到github
一.Git终端软件安装 1.下载windows上git终端,类似shell工具,下载地址:http://msysgit.github.io/ 2.安装方法,打开文件,一路点击Next即可 3.安装完成 ...
- 使用 vscode将本地项目上传到github以及删除github上的某个文件夹
安装Git后,可以看到windows环境下有两个命令输入窗口Git CMD 和Git Bash Git GUI是可视化图形界面 Git中的Bash是基于CMD的,在CMD的基础上增添一些新的命令与功能 ...
- 如何通过TortoiseGit(小乌龟)把本地项目上传到github上
1.第一步: 安装git for windows(链接:https://gitforwindows.org/)一路next就好了, 如果遇到什么问题可以参考我另外一篇文章~^ - ^ 2.第二步:安装 ...
- 如何将项目上传到GitHub?
如何将项目上传到GitHub? 1.注册GitHub账户 浏览器输入GitHub官网地址:https://github.com/ 进入后点击Sign In 然后点击Create an account ...
- Git的使用--如何将本地项目上传到Github(三种简单、方便的方法)
一.第一种方法: 1.首先你需要一个github账号,所以还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下载地址,下载后一路(傻瓜式安装) ...
随机推荐
- 心动了!iPhone 15 Pro超窄边框感受下:1.5mm破历史纪录 “跑马框”再见
综合目前已知爆料来看,iPhone 15系列将有7大升级.其中一个比较明显的直观变化是,新款iPhone全系边框都会更窄.iPhone 15 Pro.Pro Max的边框宽度仅为1.55mm,破历史记 ...
- 【链表】单链表的介绍和基本操作(C语言实现)【保姆级别详细教学】
单链表 文章目录 前言 单链表基本介绍 基本结构 与顺序表的区别以及学习单链表的必要性 单链表的实现 结点的定义以及头指针的创建 单链表的遍历(打印接口的实现)[重点] 开辟结点接口 尾插接口 尾删接 ...
- 洛谷P1923 求第K小的数 研讨关于输入输出效率的问题(scanf and cin ,printf and cout)
最简单的思想就是将这n个数从小到大排序,然后直接输出下标为K的数,不用想肯定会超时,三个测试点过了,另外两个超时. 那么我想的就是,既然全排序会超时,有没有什么方法可以不用全排序也可以拿出第K小的数呢 ...
- 十八张图带你入门实时监控系统HertzBeat
我们经常讲:研发人员有两只眼睛,一只是监控平台,另一只是日志平台.在对性能和高可用讲究的场景里,监控平台的重要性再怎么强调也不过分. 这篇文章,我们聊聊开源实时监控告警系统 HertzBeat 赫兹跳 ...
- Oracle删除索引规范
1.背景概述 2.索引删除规范 3.根本解决方案及建议 1.背景概述 近期应用升级上线过程中,存在删除业务表索引的变更操作,且因删除索引导致次日业务高峰时期,数据库响应缓慢的情况,经定位是缺失索引导致 ...
- 使用 Etcd 快照文件恢复 Etcd 数据:应对单节点及高可用集群情况
1.概述 在 Kubernetes 集群中,所有操作的资源数据都存储在 Etcd 数据库上.为了确保在节点故障.集群迁移或其他异常情况下能够尽快恢复集群数据,我们需要定期对 Etcd 数据进行容灾备份 ...
- CentOS7 卸载/home 扩大/root空间
卸载home 备份home分区文件 # 新系统无视 tar cvf /tmp/home.tar /home 修改fstab(这一步非常重要,千万别漏了) 准备卸载/home文件系统,centos启动时 ...
- 玩转C语言:深入理解输入输出函数的奥秘
欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 1. 单字符输出函数 在C语言中有一个函数putchar专门负责输出单个字符,其语法如 ...
- Java I/O 教程(十) ObjectOutputStream和ObjectInputStream
ObjectOutputStream ObjectOutputStream用于往输出流中写入原始类型和Java对象. 类定义 public class ObjectOutputStream exten ...
- wsl 配置ubuntu apt源为阿里源
$ sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak $ sudo sed -i 's/security.ubuntu/mirrors.a ...