zoukankan      html  css  js  c++  java
  • 经典错误::error LNK2019:无法解析的外部符号 ,该符号在函数**中被引用

    将视频逐帧提取,转换为图片保存下来:

    源代码:

    #include <cv.h>
    #include <highgui.h>

    #if 1 //错误一//错误一//错误一//错误一//错误一//错误一//错误一//错误一//错误一//错误一//错误一//错误一
    #include <libavcodec/avcodec.h>
    #include <libavdevice/avdevice.h>
    #include <libavformat/avformat.h>
    #endif

    #include "libRtsp2RGB24Sdk.h"
    #include "libRtsp2RGB24Header.h"

    int nFrameWidth=1920, nFrameHeight=1080;
    void SaveFrame(AVPicture pFrameRGB, int width, int height)
    {
    IplImage * dst = cvCreateImage(cvSize(nFrameWidth,nFrameHeight),8,3);;
    LPVOID pMem = (LPVOID)pFrameRGB.data[0];

    memcpy(dst->imageData,pMem,nFrameWidth*nFrameHeight*3);

    cvSaveImage("D:\pic.jpg",dst);
    }

    void main()
    {
    avcodec_register_all();
    av_register_all();
    avformat_network_init();

    AVFormatContext *pFormatCtx;

    #if 1 //错误二//错误二//错误二//错误二//错误二//错误二//错误二//错误二//错误二//错误二//错误二//错误二
    pFormatCtx = avformat_alloc_context(); //必不可少!
    #endif

    char *filename = "222.mpg"; // "C:\Users\HYZ\Desktop\2.avi";

    avformat_open_input(&pFormatCtx, filename, NULL, 0);

    av_find_stream_info(pFormatCtx);

    int videoStream=-1;
    for(int i=0; i<pFormatCtx->nb_streams; i++)
    if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO)
    {
    videoStream=i;
    break;
    }
    if(videoStream == -1)
    {
    //sInfo.Format("视频中无视频解码器信息");
    //return FALSE;
    }

    AVCodec * pCodec;
    AVCodecContext * pCodecCtx;
    pCodecCtx = pFormatCtx->streams[videoStream]->codec;
    pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
    if (!pCodec)
    {
    //sInfo.Format("无法找到视频解码器");
    //return FALSE;
    }
    avcodec_open2(pCodecCtx, pCodec, NULL); // 打开解码器

    int frameFinished = 0;

    AVFrame *pFrame;
    pFrame=avcodec_alloc_frame();

    AVPacket avPacket;
    av_init_packet(&avPacket);

    AVPicture pRGBFrame;
    avpicture_alloc(&pRGBFrame,PIX_FMT_RGB24,nFrameWidth,nFrameHeight);

    SwsContext * pSwsContext;
    pSwsContext = sws_getContext(nFrameWidth, nFrameHeight, pCodecCtx->pix_fmt, nFrameWidth, nFrameHeight,
    PIX_FMT_BGR24,SWS_FAST_BILINEAR,NULL,NULL,NULL);

    while(av_read_frame(pFormatCtx, &avPacket)>=0)
    {
    if(avPacket.stream_index==videoStream)
    {
    avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &avPacket);//解码

    if(frameFinished>0)
    {
    sws_scale(pSwsContext, pFrame->data, pFrame->linesize, 0, nFrameHeight, pRGBFrame.data, pRGBFrame.linesize);
    }

    SaveFrame(pRGBFrame, pCodecCtx->width, pCodecCtx->height); //保存数据

    av_free_packet(&avPacket); //释放
    }
    }
    }

    错误一:

    运行后错误提示:

    1>111.obj : error LNK2019: 无法解析的外部符号 "void __cdecl av_free_packet(struct AVPacket *)" (?av_free_packet@@YAXPAUAVPacket@@@Z),该符号在函数 _main 中被引用
    1>111.obj : error LNK2019: 无法解析的外部符号 "int __cdecl avcodec_decode_video2(struct AVCodecContext *,struct AVFrame *,int *,struct AVPacket const *)" (?avcodec_decode_video2@@YAHPAUAVCodecContext@@PAUAVFrame@@PAHPBUAVPacket@@@Z),该符号在函数 _main 中被引用
    1>111.obj : error LNK2019: 无法解析的外部符号 "int __cdecl av_read_frame(struct AVFormatContext *,struct AVPacket *)" (?av_read_frame@@YAHPAUAVFormatContext@@PAUAVPacket@@@Z),该符号在函数 _main 中被引用
    1>111.obj : error LNK2019: 无法解析的外部符号 "int __cdecl avpicture_alloc(struct AVPicture *,enum AVPixelFormat,int,int)" (?avpicture_alloc@@YAHPAUAVPicture@@W4AVPixelFormat@@HH@Z),该符号在函数 _main 中被引用
    1>111.obj : error LNK2019: 无法解析的外部符号 "void __cdecl av_init_packet(struct AVPacket *)" (?av_init_packet@@YAXPAUAVPacket@@@Z),该符号在函数 _main 中被引用
    1>111.obj : error LNK2019: 无法解析的外部符号 "struct AVFrame * __cdecl avcodec_alloc_frame(void)" (?avcodec_alloc_frame@@YAPAUAVFrame@@XZ),该符号在函数 _main 中被引用
    1>111.obj : error LNK2019: 无法解析的外部符号 "int __cdecl avcodec_open2(struct AVCodecContext *,struct AVCodec const *,struct AVDictionary * *)" (?avcodec_open2@@YAHPAUAVCodecContext@@PBUAVCodec@@PAPAUAVDictionary@@@Z),该符号在函数 _main 中被引用
    1>111.obj : error LNK2019: 无法解析的外部符号 "struct AVCodec * __cdecl avcodec_find_decoder(enum AVCodecID)" (?avcodec_find_decoder@@YAPAUAVCodec@@W4AVCodecID@@@Z),该符号在函数 _main 中被引用
    1>111.obj : error LNK2019: 无法解析的外部符号 "int __cdecl av_find_stream_info(struct AVFormatContext *)" (?av_find_stream_info@@YAHPAUAVFormatContext@@@Z),该符号在函数 _main 中被引用
    1>111.obj : error LNK2019: 无法解析的外部符号 "int __cdecl avformat_open_input(struct AVFormatContext * *,char const *,struct AVInputFormat *,struct AVDictionary * *)" (?avformat_open_input@@YAHPAPAUAVFormatContext@@PBDPAUAVInputFormat@@PAPAUAVDictionary@@@Z),该符号在函数 _main 中被引用
    1>111.obj : error LNK2019: 无法解析的外部符号 "struct AVFormatContext * __cdecl avformat_alloc_context(void)" (?avformat_alloc_context@@YAPAUAVFormatContext@@XZ),该符号在函数 _main 中被引用
    1>111.obj : error LNK2019: 无法解析的外部符号 "int __cdecl avformat_network_init(void)" (?avformat_network_init@@YAHXZ),该符号在函数 _main 中被引用
    1>111.obj : error LNK2019: 无法解析的外部符号 "void __cdecl av_register_all(void)" (?av_register_all@@YAXXZ),该符号在函数 _main 中被引用
    1>111.obj : error LNK2019: 无法解析的外部符号 "void __cdecl avcodec_register_all(void)" (?avcodec_register_all@@YAXXZ),该符号在函数 _main 中被引用
    1>C:UsersHYZDesktop测试环境集stream22.exe : fatal error LNK1120: 14 个无法解析的外部命令

    解决方法:注释掉错误一,不包含那些头文件即可。包含太多的文件也会发生无法解析的错误,搞不懂。

    错误二:

    运行到avformat_open_input()函数处停止,而且F11也进不去。

    弹出错误提示框:stream22.exe中的*****处有未经处理的异常:0xc0000005:读取位置0xccccccccccc时发生访问冲突

    解决方法:分配内存空间即可:这类错误一般是内存错误导致,重点排查内存分配。

  • 相关阅读:
    printf,wprintf与setlocale,char与wchar_t区别
    C++常量表达式、const、constexpr(C++11新增)的区别
    珍珠项链 Beads
    A Horrible Poem
    三个朋友
    Seek the Name, Seek the Fame
    Power Strings
    图书管理
    子串查找
    山峰和山谷 Ridges and Valleys
  • 原文地址:https://www.cnblogs.com/hyz5525/p/4900340.html
Copyright © 2011-2022 走看看