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。

posted on 2020-06-19 20:48  bbqz007  阅读(540)  评论(0编辑  收藏  举报