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的头文件。
修复步骤
修改CMake链接关键字:
将Vision库的target_link_libraries中的PRIVATE改为PUBLIC,让所有依赖Vision的目标自动获取Qt Network的头文件路径和链接依赖:find_package(Qt6 REQUIRED COMPONENTS Network) target_link_libraries(Vision PUBLIC Qt6::Network)验证Qt组件安装:
如果修改后仍报错,确认系统已安装Qt6 Network开发包。以Ubuntu为例,执行以下命令安装:sudo apt install libqt6network6-dev重新编译:
删除build目录,重新运行CMake配置和编译:rm -rf build && mkdir build && cd build cmake .. make
内容的提问来源于stack exchange,提问作者Icksir
相关产品推荐
相关产品推荐

