使用 clang 编译时在 Windows 上出现 ASIO“不支持操作”运行时错误

问题描述 投票:0回答:1
我正在尝试不再使用 Visual Studio 并更多地使用命令行编译,但是我遇到了一个问题,该项目在 Windows 上使用 Clang 编译的仅头文件、独立(非升压)形式中使用 ASIO。

Visual Studio 和 Clang 编译都没有错误,但是在运行 Clang 版本时,在创建

thread: The attempted operation is not supported for the type of object referenced.

 时出现运行时错误 
asio::thread

一个最小的例子;

main.cpp


#include <iostream> #include <vector> #include <string> #include <map> #define _WIN32_WINNT 0x0601 #define ASIO_STANDALONE #define STANDALONE #include <asio.hpp> void foobar() { std::cout << "B" << std::endl; } int main() { asio::io_context ctx; std::cout << "A "; try { asio::thread thr(std::bind(&foobar)); thr.join(); } catch (std::exception& e) { std::cout << e.what() << std::endl; } }
Clang 构建命令

clang++ -std=c++20 main.cpp -I"asio-1.30.2/include" -luser32 -lkernel32 -lshell32

 -> 
0

Visual Studio 配置为空白 C++ 应用程序的“标准”,但将

asio/include

 添加到包含路径除外。 Visual Studio 的构建也没有问题。

通过 Visual Studio 构建的版本按预期输出

A B

,但是 Clang 版本输出

A thread: The attempted operation is not supported for the type of object referenced.
我有三种可能的猜测;

    我没有通过
  1. #define
    正确配置ASIO
  2. 我没有正确链接程序
  3. ASIO 不支持使用 clang 在 Windows 上构建仅标头、独立的
c++ windows clang runtime-error asio
1个回答
0
投票
想通了。

按照

catnip的建议,我检查了ASIO代码中出现错误的位置,发现它发生在null_thread.hpp

中,如果未定义
asio::thread
,则
ASIO_HAS_THREADS
会被typedef'ed。我以为这会由 ASIO 或我正在使用的 websocket 库自动定义,但显然不是。

tl;博士;将

#define ASIO_HAS_THREADS

 添加到 
main.cpp
-DASIO_HAS_THREADS
 到构建命令。

© www.soinside.com 2019 - 2024. All rights reserved.