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.
我有三种可能的猜测;
#define
的正确配置ASIO
按照
catnip的建议,我检查了ASIO代码中出现错误的位置,发现它发生在null_thread.hpp
中,如果未定义
asio::thread
,则
ASIO_HAS_THREADS
会被typedef'ed。我以为这会由 ASIO 或我正在使用的 websocket 库自动定义,但显然不是。tl;博士;将
#define ASIO_HAS_THREADS
添加到
main.cpp
或
-DASIO_HAS_THREADS
到构建命令。