boost::asio 使用msvc编译

在windows下编译asio库(asio.lib、asio.dll)

简介

asio 是boost库中优秀的网络库。asio是一个异步的io库,支持以同步或异步的方式处理事件,也可以用于基于tcp或udp的网络通信。

(1)可移植到windows(完成端口实现)、linux(epoll实现)、FreeBSD、UNIX(kqueue实现)。

(2)可扩展性。

(3)效率很高。

(4)易使用,类 Socket API 编程模型。

支持同步、异步通信方式。

源码下载

路径

Asio C++ Library

二级链接(可能随时更新到新版本):sourceforge网站的asio1.30.2版本代码asio C++ library - Browse /asio/1.30.2 (Stable) at SourceForge.net

新建asio.cpp文件

#define ASIO_SEPARATE_COMPILATION
#define ASIO_DYN_LINK
#define _WIN32_WINNT          0x0601

#include "asio/impl/src.hpp"

将asio.cpp文件放在asio-1.30.2\include\文件夹中

(该文件夹中一定有asio文件夹)

创建编译脚本或编译

REM 声明编译环境 表示在64位环境中生成32位 程序
call "D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsamd64_x86.bat"
echo.
echo "run vcvarsamd64_x86.bat"
echo.

REM 编译 /c可避免错误:LINK : fatal error LNK1561: 必须定义入口点
cl /EHsc /c asio.cpp

REM 生成lib文件和obj文件
lib /out:asio.lib asio.obj

REM 链接
link /dll asio.obj

执行上面过程后,可以生成lib和dll文件

注:

/EHsc参考下面链接学习

vs中/EHa、/EHs、/EHsc的区别_ehsc eha-优快云博客

题外

因为asio是头文件的库,所以,可能编译了一个寂寞

<think>嗯,用户问的是用MinGW编译Boost库,MSVC能不能使用。这个问题我得仔细想想。首先,Boost库本身是跨平台的,支持多种编译器。但关键点在于不同编译器生成的二进制是否兼容。 我记得MSVC和MinGW虽然都能编译C++代码,但它们的ABI(应用程序二进制接口)不兼容。ABI涉及函数调用约定、异常处理、对象内存布局等,如果这些不一致,链接时会出问题。比如,MSVC使用自己的运行时库,而MinGW使用GCC的,这可能导致链接错误或者运行时崩溃。 然后,动态链接和静态链接的情况可能不同。静态库会把代码直接打包到可执行文件中,这时候如果编译器不同,肯定会有问题。动态库的话,可能还会涉及到DLL的导出符号和调用约定不一致,同样可能导致问题。 不过,如果用户只是使用Boost的头文件库,比如Boost.AsioBoost.SmartPtr这些,那就不需要编译,直接包含头文件就行,这时候MSVC是可以用的,因为不涉及二进制兼容问题。但如果是需要编译的部分,比如Boost.Filesystem、Boost.System,就必须用MSVC重新编译。 另外,用户可能需要确认Boost版本是否支持他们的MSVC版本。不同版本的MSVC可能需要不同的Boost构建配置,比如工具集版本。还有,运行时库的选项也要一致,比如MT、MD等,否则可能会有冲突。 总结一下,用户的问题核心在于二进制兼容性。必须用相同编译器生成的库才能确保兼容。所以正确的做法是用MSVC重新编译Boost,而不是使用MinGW编译的版本。同时提醒用户注意工具集版本和运行时库选项的设置,避免后续问题。</think>使用 MinGW 编译Boost 库通常**无法直接**在 MSVC(Microsoft Visual C++)中使用,主要原因如下: --- ### 1. **ABI 不兼容** - **编译器差异**:MSVC 和 MinGW(基于 GCC)使用不同的 **C++ ABI(应用二进制接口)**,包括函数调用约定、异常处理、名称修饰(Name Mangling)等。这会导致链接时出现符号错误或运行时崩溃。 - **运行时库差异**:MSVC 依赖 `MSVCRT` 运行时库,而 MinGW 使用 `libstdc++`(GCC 的标准库),二者二进制不兼容。 --- ### 2. **静态库 vs 动态库** - **静态库(.lib/.a)**:直接嵌入到可执行文件中,必须与编译器完全兼容。MinGW 编译的静态库无法被 MSVC 识别。 - **动态库(.dll)**:即使生成 DLL,MSVC 和 MinGW 的导出符号规则和调用约定(如 `__cdecl` vs `__stdcall`)也不同,无法直接使用。 --- ### 3. **头文件库的例外** - 如果仅使用 Boost 的**头文件库**(如 `Boost.Asio`, `Boost.SmartPtr` 等),则无需编译MSVC 可直接包含头文件使用。 - 需要编译的库(如 `Boost.Filesystem`, `Boost.System`)必须用 MSVC 重新构建。 --- ### 解决方案:为 MSVC 编译 Boost 1. **使用 MSVC 工具链重新编译**: - 运行 `bootstrap.bat` 生成 MSVC 专用的构建工具。 - 使用以下命令指定工具集: ```bash b2 toolset=msvc-14.3 (替换为你的 MSVC 版本,如 msvc-14.2 对应 VS 2019) ``` - 确保编译时选择与项目一致的**运行时库选项**(如 `/MT` 或 `/MD`)。 2. **预编译库**: - 直接从 [Boost 官方](https://www.boost.org/) 或第三方(如 vcpkg)获取 MSVC编译版本。 --- ### 关键注意事项 - **工具集版本**:MSVC 2015/2017/2019/2022 的 ABI 兼容性较好,但仍需匹配工具集版本(如 `msvc-14.x`)。 - **架构一致性**:确保编译时选择相同的架构(x86 或 x64)。 --- ### 总结 **MinGW 编译Boost 二进制库无法直接在 MSVC使用**,必须使用 MSVC 工具链重新编译。若仅使用头文件库(Header-only),则无需额外操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值