VSCode 环境下编译运行 C++ 项目

张开发
2026/4/11 20:54:25 15 分钟阅读

分享文章

VSCode 环境下编译运行 C++ 项目
macOS VSCode 环境下编译运行 C 项目完整指南以 Modbus TCP 通信为例本文以一个通过 Modbus TCP 协议与 PLC 通信的 C 项目为例从零开始搭建 macOS 上的 C 开发环境涵盖工具安装、第三方库引入、CMake 自动化构建等内容。适合 C 初学者和从其他语言转过来的开发者。一、环境准备1.1 操作系统与硬件macOS本文基于 Apple Silicon M 系列芯片Intel Mac 需调整部分路径VSCode 编辑器1.2 安装 HomebrewHomebrew 是 macOS 上的包管理器相当于 Ubuntu 的apt、Python 的pip。如果还没安装过打开终端执行/bin/bash-c$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)安装完成后验证brew--version1.3 安装编译工具链# C 编译器macOS 自带 clang也可以安装 gccxcode-select--install# CMake 构建工具brewinstallcmake# pkg-config用于自动查找第三方库的路径brewinstallpkg-config1.4 安装第三方库以 libmodbus 为例brewinstalllibmodbus安装完成后Homebrew 会把文件放在以下位置M 系列 Mac文件类型路径头文件/opt/homebrew/include/modbus/modbus.h通过 pkg-config 以#include modbus.h引用库文件/opt/homebrew/lib/libmodbus.dylibpkg-config 配置/opt/homebrew/lib/pkgconfig/libmodbus.pc注意Intel Mac 的路径是/usr/local/而非/opt/homebrew/。二、手动编译快速验证如果只是想快速编译单个文件可以直接在终端执行g-omy_program my_program.cpp\-I/opt/homebrew/include\-L/opt/homebrew/lib\-lmodbus参数说明参数含义-o my_program输出的可执行文件名-I/opt/homebrew/include告诉编译器去哪里找头文件-L/opt/homebrew/lib告诉链接器去哪里找库文件-lmodbus链接 libmodbus 库运行./my_program这种方式的缺点是每次编译都要手动输入一长串路径参数容易出错也不便于管理多文件项目。三、使用 CMake 自动化构建推荐3.1 什么是 CMakeCMake 是一个跨平台的构建管理工具。你只需要写一个CMakeLists.txt配置文件告诉它项目用了什么库CMake 会自动找到库的路径并生成编译指令。配置一次终身受益。3.2 项目目录结构testPLCbyCPP/ ├── CMakeLists.txt # 构建配置文件只需写一次 ├── test_f20_09.cpp # 测试程序 1 ├── test_f20_12.cpp # 测试程序 2后续新增 ├── test_xxx.cpp # 更多测试程序后续新增 └── build/ # 编译输出目录自动生成 ├── test_f20_09 # 可执行文件 1 ├── test_f20_12 # 可执行文件 2 └── ...3.3 编写 CMakeLists.txt在项目根目录创建CMakeLists.txt内容如下cmake_minimum_required(VERSION 3.10) project(testPLCbyCPP) set(CMAKE_CXX_STANDARD 17) # 自动查找 libmodbus find_package(PkgConfig REQUIRED) pkg_check_modules(MODBUS REQUIRED libmodbus) # 自动查找当前目录下所有 .cpp 文件 # 每个 .cpp 文件编译为一个独立的可执行文件 file(GLOB ALL_SOURCES *.cpp) foreach(SOURCE_FILE ${ALL_SOURCES}) get_filename_component(EXEC_NAME ${SOURCE_FILE} NAME_WE) add_executable(${EXEC_NAME} ${SOURCE_FILE}) target_include_directories(${EXEC_NAME} PRIVATE ${MODBUS_INCLUDE_DIRS}) target_link_directories(${EXEC_NAME} PRIVATE ${MODBUS_LIBRARY_DIRS}) target_link_libraries(${EXEC_NAME} ${MODBUS_LIBRARIES}) endforeach()逐行解释cmake_minimum_required指定最低 CMake 版本project项目名称set(CMAKE_CXX_STANDARD 17)使用 C17 标准find_package(PkgConfig REQUIRED)启用 pkg-config 工具pkg_check_modules(MODBUS REQUIRED libmodbus)通过 pkg-config 自动查找 libmodbus 的头文件路径、库路径、库名称分别存入MODBUS_INCLUDE_DIRS、MODBUS_LIBRARY_DIRS、MODBUS_LIBRARIES变量file(GLOB ALL_SOURCES *.cpp)扫描当前目录下所有.cpp文件foreach循环为每个.cpp文件创建一个同名的可执行文件并自动设置好头文件路径和库链接3.4 编译与运行# 进入项目目录cdtestPLCbyCPP# 创建并进入 build 目录首次执行mkdirbuildcdbuild# 生成编译配置首次执行或 CMakeLists.txt 改动后执行cmake..# 编译make# 运行./test_f20_09正常输出示例-- Found PkgConfig: /opt/homebrew/bin/pkg-config (found version 2.5.1) -- Checking for module libmodbus -- Found libmodbus, version 3.1.11 -- Configuring done -- Generating done [ 50%] Building CXX object CMakeFiles/test_f20_09.dir/test_f20_09.cpp.o [100%] Linking CXX executable test_f20_09 [100%] Built target test_f20_093.5 日常开发工作流场景操作修改了已有的.cpp文件在build目录执行make新增了一个.cpp文件在build目录执行cmake .. make修改了CMakeLists.txt在build目录执行cmake .. make想清理重新编译删除build目录重新mkdir build cd build cmake .. make四、VSCode 集成4.1 推荐安装的扩展在 VSCode 扩展商店搜索安装以下扩展C/CMicrosoft 出品代码高亮、智能提示、调试CMake ToolsMicrosoft 出品CMake 项目集成支持一键编译运行4.2 使用 CMake Tools 扩展安装 CMake Tools 后VSCode 底部状态栏会出现 CMake 相关按钮打开项目文件夹包含CMakeLists.txt的目录按CmdShiftP输入CMake: Configure选择编译器通常选 Clang按CmdShiftP输入CMake: Build或直接点击底部状态栏的 Build 按钮在终端中执行./build/test_f20_09运行4.3 配置头文件路径提示消除红色波浪线如果 VSCode 的 IntelliSense 对#include modbus.h报红色波浪线找不到头文件在项目根目录创建.vscode/c_cpp_properties.json{configurations:[{name:Mac,includePath:[${workspaceFolder}/**,/opt/homebrew/include/modbus],defines:[],macFrameworkPath:[/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks],compilerPath:/usr/bin/clang,cStandard:c17,cppStandard:c17,intelliSenseMode:macos-clang-arm64}],version:4}Intel Mac 用户需将intelliSenseMode改为macos-clang-x64includePath中的/opt/homebrew/include改为/usr/local/include。五、常见问题排查5.1fatal error: modbus.h file not found原因头文件路径不对。libmodbus 的 pkg-config 配置Cflags: -I.../include/modbus会将 include 路径直接指向modbus/子目录所以代码中应使用#include modbus.h而非#include modbus/modbus.h。解决确认代码中使用#include modbus.h并确保 cmake 通过pkg_check_modules拿到了正确的 include 路径。5.2zsh: command not found: cmake原因没有安装 CMake。解决执行brew install cmake。5.3zsh: command not found: pkg-config原因没有安装 pkg-config。解决执行brew install pkg-config。5.4clang: warning: overriding deployment version from 16.0 to 26.0原因编译器的目标系统版本设置不一致不影响功能。解决可以忽略或在CMakeLists.txt中加一行消除警告set(CMAKE_OSX_DEPLOYMENT_TARGET CACHE STRING FORCE)5.5 链接错误ld: library modbus not found原因链接器找不到 libmodbus 库文件。解决确认 libmodbus 已安装brew list libmodbus然后使用 CMake 的pkg_check_modules自动查找或手动指定-L/opt/homebrew/lib。六、完整示例代码以下是一个通过 Modbus TCP 向 PLC 发送指令并等待执行完成的完整示例#includemodbus.h#includestdio.h#includestdlib.h#includeunistd.h#includestdint.hintmain(){// 1. 连接 PLCconstchar*PLC_IP192.168.1.200;modbus_t*ctxmodbus_new_tcp(PLC_IP,502);if(modbus_connect(ctx)-1){fprintf(stderr,连接失败: %s\n,modbus_strerror(errno));modbus_free(ctx);return-1;}printf(连接成功!\n);// 2. 写入参数到 Modbus 寄存器uint16_tvalue42;modbus_write_register(ctx,50900,value);printf(已写入参数: %d → 地址 50900\n,value);// 3. 发送启动信号uint16_taction_id1;modbus_write_register(ctx,50009,action_id);printf(已发送启动信号: action_id%d\n,action_id);// 4. 轮询等待完成信号uint16_tresult0;while(result!action_id){sleep(1);modbus_read_registers(ctx,50059,1,result);printf(等待中... G_F20_End[9] %d\n,result);}printf(执行完成!\n);// 5. 清除启动信号modbus_write_register(ctx,50009,0);// 6. 断开连接modbus_close(ctx);modbus_free(ctx);return0;}七、总结方式适用场景命令手动 g 编译临时测试单个文件g -o out file.cpp -I... -L... -l...CMake 构建正式项目开发cmake .. makeVSCode CMake Tools日常开发体验最佳点击按钮或CmdShiftP核心要点用 CMake 管理项目配置一次CMakeLists.txt以后新增.cpp文件只需cmake .. make不用手动指定任何路径。

更多文章