C++报错和其他不是Qt或者VS的报错的汇总

266 阅读2分钟

不属于Qt VS的,比如ffmpeg OpenCV的报错,都是本栏接收

  • ! "c2243 类型转换存在,但无法访问"
    A:派生类没继承方式没指明publicprivate
  • ! "使用未定义类型,未知重写说明符"
    错误示范:
    #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: 循环包含导致包含不清;
    A包含B,同时B包含A,想用前置声明来解决问题,此种想法过于简单
    在声明之后,定义之前,类是一个不完全类型(incompete type),即已知向前声明过的类是一个类型,但不知道包含哪些成员。不完全类型只能以有限方式使用,不能定义该类型的对象,不能使用该类的函数或成员.不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。解决办法:
    • 1 老老实实写.h``.cpp文件
    • 2 .h中使用了指针类型成员可使用前置声明
  • 在使用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的头文件前加上宏,另外注意,ffmpegc语言库
    #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封装mp4文件没写文件尾_播放文件时报错moov not found.png
    该作者留了相关复用(封装)的文章FFmpeg: Muxing