C++ 和 QT 线程外部变量不起作用

C++ and QT thread extern variable not working

提问人:bjorn 提问时间:10/21/2020 更新时间:10/21/2020 访问量:196

问:

我正在编写一个 C++ 程序,并且我正在将 QT 用于 GUI。我需要将数据从一个 QT 线程传递到另一个线程,所以我决定使用外部变量,但它不起作用。这是我的代码:

stream_buffer.h

#ifndef STREAM_BUFFER_H
#define STREAM_BUFFER_H

#include "opencv2/core.hpp"

extern cv::Mat frame_buffer;

#endif // STREAM_BUFFER_H

线程1.cpp

#include "stream_buffer.h"

//Some code

cv::Mat frame_buffer;

video_stream >> frame_buffer;

//other code

线程2.cpp

#include "stream_buffer.h

imshow("debug", frame_buffer);

在编译过程中,我收到错误。如果我也在 Thread2.cpp 中定义变量,它会编译,但它当然不起作用(因为它是一个局部变量,所以它不会从公共头文件中读取值)。unresolved external symbol frame_buffer in function void run in Thread2.cppframe_buffer

我该如何解决这个问题? 谢谢

C++ Qt 未解析外部

评论

0赞 vahancho 10/21/2020
extern cv::Mat frame_buffer;只是一个声明。这个全局变量在哪里定义?
0赞 bjorn 10/21/2020
在 中,有一条线。我必须在变量中放置一个值吗?Thread1.ccpcv::Mat frame_buffer;
0赞 Alexandre 10/22/2020
变量真的是完全全局的吗?它不是局部变量吗?如果是本地的,则无法工作。一般来说,不鼓励在 C++ 中使用“extern”(除了少数特定情况),所以我的建议是创建一个适当的 getter 函数来访问它。但是,从多个线程访问同一变量时,要非常小心并发。
0赞 bjorn 10/22/2020
@Alexandre是的,我认为它是完全全球化的。我已将变量声明为在头文件中。然后,我将此标头包含在将使用该变量的cpp文件中。在这 2 个 cpp 文件之一中,我填充变量,在另一个文件中,我将读取它。编译时,我收到链接器错误!extern
0赞 Alexandre 10/23/2020
你在同一个库中有两个线程吗?即这可能是一个“出口”问题?如果你放一个 getter 函数,它会解决你的问题吗?例如 cv::Mat& getFrameBuffer();在标头中,并在 Thread1.cpp 中定义函数?(这不是最好的,getter 应该用于局部变量,所以在 Thread2.h 中声明而不是在 stream_buffer.h 中声明)。但这个测试可以帮助理解问题所在。

答: 暂无答案