不属于Qt
VS
的,比如ffmpeg
OpenCV
的报错,都是本栏接收
- ! "c2243 类型转换存在,但无法访问"
A:派生类没继承方式没指明public
或private
- ! "使用未定义类型,未知重写说明符"
错误示范:
A: 循环包含导致包含不清;#pragma pnce #include <QObject> #include <QProcess> #include <QString> #include <atomic> #include <QTimer> #include <QThread> class ProcessManager; class MessageRecviver : public QObject { Q_OBJECT public: MessageRecviver(ProcessManager* p_in):p(p_in){} public slots: // void operator()() void recv() { }; private: ProcessManager* p; }; class ProcessManager : public QObject { Q_OBJECT public: explicit ProcessManager(QObject *parent = 0); bool start(const std::string& cmd, uint16_t int_sec_in); void stop(); std::atomic_bool flag_is_in_pushing; signals: public slots: private slots: void SLOT_finished(int exitCode, QProcess::ExitStatus exitStatus); void SLOT_timeoutReconnect(); private: void connectSlot(); void killProcess(); private: QProcess* p_qprocess_instance{nullptr}; uint64_t p_id{0}; std::string exe_name; uint16_t int_sec; uint64_t time_stamp_last_push; QThread thread_instance; MessageRecviver message_reciver; };
A
包含B
,同时B
包含A
,想用前置声明来解决问题,此种想法过于简单
在声明之后,定义之前,类是一个不完全类型(incompete type),即已知向前声明过的类是一个类型,但不知道包含哪些成员。不完全类型只能以有限方式使用,不能定义该类型的对象,不能使用该类的函数或成员.不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。解决办法:- 1 老老实实写
.h``.cpp
文件 - 2
.h
中使用了指针类型成员
可使用前置声明
- 1 老老实实写
- 在使用
vc
库时,比如windows.h
然后又用了其他的三方库,比如纯C++
的东西或者ffmpeg
之类的,报错
! "byte 不明确的符号"
解决:# 尽量将三方库限制在cpp模块内, 可疑的.h文件前加该 #define _HAS_STD_BYTE 0 // before any includes
ffmpeg
报错
ffmpeg
的报错
! error : missing -D__STDC_CONSTANT_MACROS
解决:在ffmpeg
的头文件前加上宏,另外注意,ffmpeg
是c
语言库#define __STDC_CONSTANT_MACROS #define __STDC_LIMIT_MACROS extern "C" { #include <libavutil/avassert.h> }
- ! error: 'CODEC_FLAG_GLOBAL_HEADER' 未声明的标识符
解决:# 该宏改为 AV_CODEC_FLAG_GLOBAL_HEADER
- 在封装成
mp4
文件时,只写了文件头avformat_write_header()
,和文件体av_interleaved_frame_write()
,没注意写文件尾av_write_trailer()
,导致mp4
文件根本不完整,查找这个问题浪费了大量时间
解决:
该作者留了相关复用(封装)的文章FFmpeg: Muxing