具体的MSYS2及vscode关于C++项目的配置,参考上一篇博客:
https://blog.csdn.net/weixin_41212298/article/details/154026060
本项目是在windows系统上进行配置的。
1.基本的 C++ 项目结构
|
my_project/ ├── bin/ ├── src/ │ └── main.cpp ├── include/ ├── .vscode/ │ ├── tasks.json │ ├── launch.json │ └── c_cpp_properties.json └── Makefile (或 CMakeLists.txt) |
如:

2.编写示例代码
由于本人使用的windows系统,因此采用纯净版服务
2.1 src/main.cpp:
|
#define _WIN32_WINNT 0x0A00 #define WIN32_LEAN_AND_MEAN #include <iostream> #include <vector> #include <thread> #include <mutex> #include <map> #include <string> #include <sstream> #include <winsock2.h> #include <ws2tcpip.h> #pragma comment(lib, “ws2_32.lib”) using namespace std; class MathService { public: static int add(int a, int b) { return a + b; } static int multiply(int a, int b) { return a * b; }
static vector<int> fibonacci(int n) { vector<int> result; if (n <= 0) return result; result.push_back(0); if (n == 1) return result; result.push_back(1); for (int i = 2; i < n; i++) { result.push_back(result[i-1] + result[i-2]); } return result; } }; string create_response(const string& content, const string& content_type = “application/json”) { stringstream response; response << “HTTP/1.1 200 OK << “Content-Type: ” << content_type << ” << “Content-Length: ” << content.length() << ” << “Connection: close << “Access-Control-Allow-Origin: * << ” << content; return response.str(); } string handle_request(const string& request) { if (request.find(“GET /health”) != string::npos) { return create_response(R”({“status”: “healthy”, “service”: “Windows Socket Server”})”); } else if (request.find(“GET /api/add”) != string::npos) { int a = 15, b = 25; int result = MathService::add(a, b); return create_response(R”({“operation”: “add”, “a”: )” + to_string(a) + R”(, “b”: )” + to_string(b) + R”(, “result”: )” + to_string(result) + “}”); } else if (request.find(“GET /api/multiply”) != string::npos) { int a = 8, b = 7; int result = MathService::multiply(a, b); return create_response(R”({“operation”: “multiply”, “a”: )” + to_string(a) + R”(, “b”: )” + to_string(b) + R”(, “result”: )” + to_string(result) + “}”); } else if (request.find(“GET /api/fibonacci”) != string::npos) { auto fib_seq = MathService::fibonacci(10); string sequence = “[“; for (size_t i = 0; i < fib_seq.size(); i++) { sequence += to_string(fib_seq[i]); if (i < fib_seq.size() – 1) sequence += “, “; } sequence += “]”; return create_response(R”({“operation”: “fibonacci”, “sequence”: )” + sequence + “}”); } else { string html = R”( <!DOCTYPE html> <html> <head> <title>C++ Windows Socket Server</title> </head> <body> <h1>✅ C++ Windows Socket 服务器运行中</h1> <p>这是一个纯 Windows Socket 实现的 HTTP 服务器</p> <ul> <li><a href=”/health”>/health</a> – 健康检查</li> <li><a href=”/api/add”>/api/add</a> – 加法服务</li> <li><a href=”/api/multiply”>/api/multiply</a> – 乘法服务</li> <li><a href=”/api/fibonacci”>/api/fibonacci</a> – 斐波那契数列</li> </ul> </body> </html> )”; return create_response(html, “text/html”); } } void handle_client(SOCKET client_socket) { char buffer[4096]; int bytes_received = recv(client_socket, buffer, sizeof(buffer) – 1, 0);
if (bytes_received > 0) { buffer[bytes_received] = ''; string request(buffer); string response = handle_request(request); send(client_socket, response.c_str(), response.length(), 0); }
closesocket(client_socket); } int main() { cout << “启动 C++ Windows Socket HTTP 服务器…” << endl;
WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { cerr << “WSAStartup 失败” << endl; return -1; }
SOCKET server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (server_socket == INVALID_SOCKET) { cerr << “Socket 创建失败” << endl; WSACleanup(); return -1; }
sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(8080);
if (bind(server_socket, (sockaddr*)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) { cerr << “绑定端口失败” << endl; closesocket(server_socket); WSACleanup(); return -1; }
if (listen(server_socket, 10) == SOCKET_ERROR) { cerr << “监听失败” << endl; closesocket(server_socket); WSACleanup(); return -1; }
cout << “✅ 服务器启动成功!” << endl; cout << “�� 访问地址: http://localhost:8080” << endl; cout << “⏹️ 按 Ctrl+C 停止服务器” << endl;
while (true) { sockaddr_in client_addr; int client_addr_len = sizeof(client_addr); SOCKET client_socket = accept(server_socket, (sockaddr*)&client_addr, &client_addr_len);
if (client_socket != INVALID_SOCKET) { thread client_thread(handle_client, client_socket); client_thread.detach(); } }
closesocket(server_socket); WSACleanup(); return 0; } |
3. 配置调试文件
3.1 .vscode/c_cpp_properties.json
|
{ “configurations”: [ { “name”: “Linux”, “includePath”: [ “${workspaceFolder}/**”, “/usr/include/c++/11”, “/usr/include/x86_64-linux-gnu/c++/11” ], “defines”: [], “compilerPath”: “/usr/bin/g++”, “cStandard”: “c17”, “cppStandard”: “c++17”, “intelliSenseMode”: “linux-gcc-x64” } ], “version”: 4 } |
3.2 .vscode/tasks.json – 编译任务
|
{ “version”: “2.0.0”, “tasks”: [ { “label”: “build-http-service”, “type”: “shell”, “command”: “g++”, “args”: [ “-g”, “-std=c++17”, “-pthread”, “-D_WIN32_WINNT=0x0A00”, “-I${workspaceFolder}/include”, “-I${workspaceFolder}/third_party”, “${workspaceFolder}/src/main.cpp”, “-o”, “${workspaceFolder}/bin/http_service.exe”, “-lws2_32”, “-lssl”, “-lcrypto” ], “group”: { “kind”: “build”, “isDefault”: true }, “detail”: “编译 HTTP 服务版本 (Windows)”, “problemMatcher”: [“$gcc”] } ] } |
3.3 .vscode/launch.json – 调试配置
|
{ “version”: “0.2.0”, “configurations”: [ { “name”: “Debug HTTP Service”, “type”: “cppdbg”, “request”: “launch”, “program”: “${workspaceFolder}/bin/http_service.exe”, “args”: [], “stopAtEntry”: false, “cwd”: “${workspaceFolder}”, “environment”: [], “externalConsole”: true, “MIMode”: “gdb”, “setupCommands”: [ { “description”: “为 gdb 启用整齐打印”, “text”: “-enable-pretty-printing”, “ignoreFailures”: true } ], “preLaunchTask”: “build-http-service”, “miDebuggerPath”: “gdb” } ] } |
4. 创建lib空文件夹
需要创建lib文件夹,否则会报错
5. 利用MSYS2导航到项目目录
cd /d/project/server/git/simulation/simulationAlgorithm

注意是项目目录,不是src目录
6.编译
g++ -std=c++17 -I./include src/main.cpp -o bin/windows_server.exe -lws2_32

7.运行服务
./bin/windows_server.exe

8.测试服务
1.打开浏览器访问:http://localhost:8080

2.测试接口
在cmd中输入如下命令,查看服务健康状态:
curl http://localhost:8080/health

9.在VSCODE中配置MYSY2编译运行环境
9.1调出配置
在最上面搜索框输入>或者Ctrl+Shift+P调出来,选择select Default Profile

如果没有关于MSYS2的选项,如下图所示:

那么需要进行MSYS2的配置:
9.2 打开 VSCode 设置
按 Ctrl+Shift+P,输入 “Preferences: Open Settings (JSON)”

9.3添加配置
在 settings.json 中添加配置
|
{ “terminal.integrated.profiles.windows”: { “PowerShell”: { “source”: “PowerShell”, “icon”: “terminal-powershell” }, “Command Prompt”: { “path”: [ “${env:windir}\Sysnative\cmd.exe”, “${env:windir}\System32\cmd.exe” ], “args”: [], “icon”: “terminal-cmd” }, “MSYS2 UCRT64”: { “path”: “D:\Soft\mysys2\msys2_shell.cmd”, “args”: [ “-defterm”, “-here”, “-no-start”, “-ucrt64” ], “icon”: “terminal-bash” }, “MSYS2 MINGW64”: { “path”: “D:\Soft\mysys2\msys2_shell.cmd”, “args”: [ “-defterm”, “-here”, “-no-start”, “-mingw64” ], “icon”: “terminal-bash” } }, “terminal.integrated.defaultProfile.windows”: “MSYS2 UCRT64”} |
注意: 把 “D:\Soft\mysys2\msys2_shell.cmd” 替换为你的实际 MSYS2 安装路径。
9.4 检查MSYS2路径
首先确认你的 MSYS2 安装路径,比如到达安装位置,输入msys2_shell.cmd 如果能够打开MSYS2的界面,就是正确的路径


重新调出配置
然后在最上面搜索框输入>或者ctrl+shift+p调出来
选择select Default Profile

选择MSYS2 UCRT64模式,再点击调试部分下面的➕按钮,重新打开一个终端,就是目标的终端了。

10.一键启动高阶版本:
start_with_msys2.bat:
@echo off
chcp 65001 >nul
title C++ HTTP 服务启动器
echo ====================================
echo 自动启动MSYS2并运行HTTP服务
echo ====================================
echo.
REM 直接设置你的MSYS2路径
set MSYS2_PATH=D:Softmysys2anzhuang
if not exist "%MSYS2_PATH%msys2_shell.cmd" (
echo ❌ 未找到MSYS2安装路径!
echo 请检查路径: %MSYS2_PATH%
pause
exit /b 1
)
echo ✅ 找到MSYS2路径: %MSYS2_PATH%
echo.
REM 获取当前脚本所在目录
set "PROJECT_DIR=%~dp0"
set "PROJECT_DIR=%PROJECT_DIR:~0,-1%"
echo 📁 项目目录: %PROJECT_DIR%
echo.
REM 检查是否在MSYS2环境中编译过
if not exist "binwindows_server.exe" (
echo 🔨 需要先编译服务器...
"%MSYS2_PATH%msys2_shell.cmd" -defterm -here -no-start -ucrt64 -shell bash -c "cd '%PROJECT_DIR%' && g++ -std=c++17 -I./include src/main.cpp -o bin/windows_server.exe -lws2_32 && echo '✅ 编译完成!按Enter键继续...' && read"
)
echo 🚀 启动HTTP服务...
echo 📍 服务地址: http://localhost:8080
echo 📍 健康检查: http://localhost:8080/health
echo ⏹️ 按 Ctrl+C 停止服务
echo.
REM 启动服务(保持窗口打开)
"%MSYS2_PATH%msys2_shell.cmd" -defterm -here -ucrt64 -shell bash -c "cd '%PROJECT_DIR%' && ./bin/windows_server.exe"
运行该文件,可以实现自动打开MSYS2,并运行服务。


