我正在努力处理我的 C++ 代码,因为我对大型项目和 CMake 的使用有点陌生。
我遇到了编译问题,我不知道如何解决它,因为网上所有的解决方案都使用 QtCreator,但我使用的是 VS Code。
编译问题
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;
}
}
CMakeLists.txt位于/vision/src
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
)
我不知道还需要什么文件。感谢您的帮助!
正如您在
PRIVATE
中使用 target_link_libraries
一样,链接到 Vision
的目标不会继承 Qt 目标的任何设置。要么使用 PUBLIC
,要么您还需要将 main
链接到 Qt6::Network
。