You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VSCode下CMake项目编译报错:QUdpSocket文件或目录不存在

问题:VSCode中CMake编译C++项目时找不到QUdpSocket文件

我是CMake与大型C++项目新手,在VSCode编译项目时遇到致命错误:QUdpSocket文件或目录不存在。网上现有解决方案多针对QtCreator,特附上相关信息寻求解决办法。

编译错误

In file included from /home/icksir/Documentos/robocup/sysmic-project/libs/vision/src/main.cpp:1:
/home/icksir/Documentos/robocup/sysmic-project/libs/vision/src/../include/vision.hpp:3:10: fatal error: QUdpSocket: No existe el archivo o el directorio
    3 | #include <QUdpSocket>
      |          ^~~~~~~~~~~~
compilation terminated.
make[2]: *** [libs/vision/src/CMakeFiles/main.dir/build.make:76: libs/vision/src/CMakeFiles/main.dir/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:192: libs/vision/src/CMakeFiles/main.dir/all] Error 2
make: *** [Makefile:91: all] Error 2

项目结构

.
├── build
├── CMakeLists.txt
├── libs
│   ├── behavior
│   ├── communication
│   ├── navigation  
│   ├── planning  
│   ├── referee   
│   ├── trainer    
│   └── vision
│       ├── CMakeLists.txt
│       ├── docs
│       │   └── requirements.txt
│       ├── external
│       │   ├── CMakeLists.txt
│       │   ├── proto
│       │   │   ├── messages_robocup_ssl_detection.proto
│       │   │   ├── messages_robocup_ssl_geometry.proto
│       │   │   └── messages_robocup_ssl_wrapper.proto
│       │   └── proto_compiled
│       │       ├── CMakeLists.txt
│       │       ├── messages_robocup_ssl_detection.pb.cc
│       │       ├── messages_robocup_ssl_detection.pb.h
│       │       ├── messages_robocup_ssl_geometry.pb.cc
│       │       ├── messages_robocup_ssl_geometry.pb.h
│       │       ├── messages_robocup_ssl_wrapper.pb.cc
│       │       └── messages_robocup_ssl_wrapper.pb.h
│       ├── include
│       │   ├── CMakeLists.txt
│       │   └── vision.hpp
│       ├── src
│       │   ├── CMakeLists.txt
│       │   ├── main.cpp
│       │   └── vision.cpp
│       └── tools
│           └── protobuf.bash
├── LICENSE
└── README.md

相关代码

vision.hpp

#ifndef VISION_H
#define VISION_H
#include <QUdpSocket>
#include <QObject>
#include "messages_robocup_ssl_wrapper.pb.h"

class Vision: public QObject{
    Q_OBJECT

    public:
        explicit Vision(QObject *parent);
        void initSocket();
        int port_grsim = 10020;
        void processPendingDatagrams();
        SSL_WrapperPacket packet;

    private:
        QUdpSocket *socket=nullptr;
};

#endif

vision.cpp

#include "vision.hpp"

Vision::Vision(QObject *parent) : 
    QObject(parent) {
}

void Vision::initSocket(){
    socket = new QUdpSocket(this);
    bool result =  socket->bind(QHostAddress::LocalHost, this->port_grsim);
    if(result){
        qDebug() << "Socket PASS";
    }
    else{
        qDebug() << "Socket FAIL";
    }

    processPendingDatagrams();
    connect(socket, &QUdpSocket::readyRead, this, &Vision::processPendingDatagrams);
}

void Vision::processPendingDatagrams(){
    qDebug() << "in !";
    QHostAddress sender;
    quint16 port;
    while (socket->hasPendingDatagrams())
    {
        QByteArray datagram;
        datagram.resize(socket->pendingDatagramSize());
        socket->readDatagram(datagram.data(),datagram.size(),&sender,&port);
        qDebug() <<"Message From :: " << sender.toString();
        qDebug() <<"Port From :: "<< port;
        qDebug() <<"Message :: " << datagram;
    }
}

CMake配置(/vision/src下的CMakeLists.txt)

project(SysmicEngine)

add_library(Vision vision.cpp)

#public: quien tenga acceso a Vision tiene acceso a los includes
target_include_directories(Vision
    PUBLIC 
    ${CMAKE_CURRENT_SOURCE_DIR}/../include
    ${CMAKE_CURRENT_SOURCE_DIR}/../external/proto_compiled)

find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(Vision PRIVATE Qt6::Network)

add_executable(main main.cpp)

target_link_libraries(main
    PRIVATE
    Vision
)

解决办法

核心问题

Vision库的头文件vision.hpp直接包含了Qt Network的头文件(QUdpSocket、QObject),但链接Qt6::Network时用了PRIVATE关键字,这意味着只有Vision库本身能获取到Qt Network的头文件路径和链接信息,依赖Vision的main可执行程序无法继承这些信息,导致编译main.cpp时找不到QUdpSocket的头文件。

修复步骤

  1. 修改CMake链接关键字:
    将Vision库的target_link_libraries中的PRIVATE改为PUBLIC,让所有依赖Vision的目标自动获取Qt Network的头文件路径和链接依赖:

    find_package(Qt6 REQUIRED COMPONENTS Network)
    target_link_libraries(Vision PUBLIC Qt6::Network)
    
  2. 验证Qt组件安装:
    如果修改后仍报错,确认系统已安装Qt6 Network开发包。以Ubuntu为例,执行以下命令安装:

    sudo apt install libqt6network6-dev
    
  3. 重新编译:
    删除build目录,重新运行CMake配置和编译:

    rm -rf build && mkdir build && cd build
    cmake ..
    make
    

内容的提问来源于stack exchange,提问作者Icksir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:35:19