4

次のヘッダー ファイルを (C で) 定義しました。これは必要ないため、関数の実装は省略しました。

#ifndef FFMPEG_MEDIAMETADATARETRIEVER_H_
#define FFMPEG_MEDIAMETADATARETRIEVER_H_

#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/dict.h>

int setDataSource(AVFormatContext** pFormatCtx, const char* path);

#endif /*FFMPEG_MEDIAMETADATARETRIEVER_H_*/

C++ では、2 つ目のヘッダー ファイルを次のように定義しました。

#ifndef MEDIAMETADATARETRIEVER_H
#define MEDIAMETADATARETRIEVER_H

using namespace std;

extern "C" {
  #include "ffmpeg_mediametadataretriever.h"
}

class MediaMetadataRetriever
{
public:
    MediaMetadataRetriever();
    ~MediaMetadataRetriever();
    int setDataSource(const char* dataSourceUrl);
};

#endif // MEDIAMETADATARETRIEVER_H

mediametadataretriever.cpp で、次の関数を定義しました。

int MediaMetadataRetriever::setDataSource(
    const char *srcUrl)
{
    // should call C function
    AVFormatContext* pFormatCtx;
    return setDataSource(&pFormatCtx, srcUrl);
}

この (C++) プロジェクトを Eclipse でコンパイルしようとすると、次のような「一致する関数呼び出しがありません...」というエラーが表示されます。

return setDataSource(&pFormatCtx, srcUrl);

呼び出しをコメントアウトすると、コードは正常にコンパイルされます。

int MediaMetadataRetriever::setDataSource(
    const char *srcUrl)
{
    return 0;
}

これはリンクの問題のようです。誰かが私が間違っていることを知っていますか?

4

1 に答える 1

15

setDataSourceそのコンテキストでは、メンバー関数の名前です。free関数を呼び出すには、その名前を完全に修飾してみてください。

return ::setDataSource(&pFormatCtx, srcUrl);
//     ^^
于 2013-03-15T20:03:22.533 に答える