使用g ++编译cpp文件时出错

时间:2016-01-27 21:14:46

标签: c++ g++

我有一个运行GCC 4.8.5的CentOS 7安装,我可以成功编译一个名为MyClass的cpp文件。我使用以下命令编译文件:

g++ -c -fpermissive  $(pkg-config --cflags --libs libavformat libavcodec libswscale libavutil) ./MyClass.cpp

当我在运行GCC 4.4.7的Centos 6.7上运行此命令时,出现以下错误:

In file included from ./MyClass.cpp:9:
./MyClass.h:70: warning: ISO C++ forbids initialization of member ‘pFormatCtx’
./MyClass.h:70: warning: making ‘pFormatCtx’ static
./MyClass.h:70: error: invalid in-class initialization of static data member of non-integral type ‘AVFormatContext*’

在我的MyClass.h文件中,我有一个私有变量:

AVFormatContext   *pFormatCtx = NULL;

对于我初始化为NULL的任何私有变量,都会重复此错误。

我的两个CentOS安装之间遇到的差异是否有解释?

这是完整的课程:

    //
//  MyClass.h
//  FFMpegPlayground
//

#ifndef __FFMpegPlayground__MyClass__
#define __FFMpegPlayground__MyClass__

#include <stdio.h>

#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif

#ifdef __cplusplus
#define __STDINT_MACROS
#endif

extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>
#include <libavutil/frame.h>
}

typedef enum {
    K_STATUS_OK = 0,
    K_CANT_OPEN_FILE = -1,
    K_NO_STREAM_INFO = -2,
    K_NO_VIDEO_STREAM = -3,
    K_CODEC_UNSUPPORTED = -4,
    K_CANT_COPY_CODEC = -5,
    K_CANT_OPEN_CODEC = -6,
    K_CANT_ALLOCATE_FRAME = -7,
    K_SEEK_FAILED = -8,
    K_UNABLE_TO_ACQUIRE_FRAME = -9
} MyClassStatus;

class MyClass{
public:
    MyClass();
    MyClass(const char * filePath);
    MyClass(const char * filePath, double nScale);
    ~MyClass();

    MyClassStatus getStatus();
    void seekToFrame(int frame);
    uint8_t* frameData();
    uint8_t* nextFrameData();
    uint8_t* copyOfNextFrameData();
    int getFrameHeight();
    int getFrameWidth();
    int getCurrentFrame();
    int getFrameDataSize();
    long long getNumberOfFrames();

private:

    bool fileIsLoaded;
    uint8_t* createFrame();
    int currentFrame;

    void internalSeekToFrame(int frame);

    MyClassStatus status;
    AVFormatContext   *pFormatCtx = NULL;
    int               i, videoStream;
    AVCodecContext    *pCodecCtxOrig = NULL;
    AVCodecContext    *pCodecCtx = NULL;
    AVCodec           *pCodec = NULL;
    AVFrame           *pFrame = NULL;
    AVFrame           *pFrameRGB = NULL;
    int               numBytes;
    uint8_t           *buffer = NULL;
    struct SwsContext *sws_ctx = NULL;
    uint8_t           *_createdFrameData = NULL;


    double preferredScale = 1.0;
};

#endif /* defined(__FFMpegPlayground__MyClass__) */

1 个答案:

答案 0 :(得分:2)

非静态成员的类内初始化程序,如

AVFormatContext   *pFormatCtx = NULL;

是C ++ 11的一项功能。 gcc4.4太旧了。