首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个error LNK2019:有关问题

2013-01-06 
一个error LNK2019:问题不知道大家有没有学过SDL,我最近在看SDl的时候,用vs2008创建了一个工程编译tutoria

一个error LNK2019:问题
不知道大家有没有学过SDL,我最近在看SDl的时候,用vs2008创建了一个工程编译tutorial02,代码如下:


extern "C"{
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
//#include <SDL.h>
//#include <SDL_thread.h>
};

#include <SDL.h>
#include <SDL_thread.h>

#ifdef __MINGW32__
#undef main /* Prevents SDL from overriding main() */
#endif

#include <stdio.h>

int main(int argc, char *argv[]) {
  AVFormatContext *pFormatCtx;
  int             i, videoStream;
  AVCodecContext  *pCodecCtx;
  AVCodec         *pCodec;
  AVFrame         *pFrame; 
  AVPacket        packet;
  int             frameFinished;
  float           aspect_ratio;
  static struct SwsContext *img_convert_ctx;

  SDL_Overlay     *bmp;
  SDL_Surface     *screen;
  SDL_Rect        rect;
  SDL_Event       event;

  if(argc < 2) {
    fprintf(stderr, "Usage: test <file>\n");
    exit(1);
  }
  // Register all formats and codecs
  av_register_all();
  
  if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
    fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError());
    exit(1);
  }

  // Open video file
  if(av_open_input_file(&pFormatCtx, argv[1], NULL, 0, NULL)!=0)
    return -1; // Couldn't open file
  
  // Retrieve stream information
  if(av_find_stream_info(pFormatCtx)<0)
    return -1; // Couldn't find stream information
  
  // Dump information about file onto standard error
  dump_format(pFormatCtx, 0, argv[1], 0);
  
  // Find the first video stream
  videoStream=-1;
  for(i=0; i<pFormatCtx->nb_streams; i++)
    if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO/*CODEC_TYPE_VIDEO*/) {
      videoStream=i;
      break;
    }
  if(videoStream==-1)
    return -1; // Didn't find a video stream
  
  // Get a pointer to the codec context for the video stream
  pCodecCtx=pFormatCtx->streams[videoStream]->codec;
  
  // Find the decoder for the video stream
  pCodec=avcodec_find_decoder(pCodecCtx->codec_id);


  if(pCodec==NULL) {
    fprintf(stderr, "Unsupported codec!\n");
    return -1; // Codec not found
  }
  
  // Open codec
  if(avcodec_open(pCodecCtx, pCodec)<0)
    return -1; // Could not open codec
  
  // Allocate video frame
  pFrame=avcodec_alloc_frame();

  // 创建一个显示screen
#ifndef __DARWIN__
        screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 0, 0);
#else
        screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 24, 0);
#endif
  if(!screen) {
    fprintf(stderr, "SDL: could not set video mode - exiting\n");
    exit(1);
  }
  
  // 在screen上创建一个YUV覆盖
  bmp = SDL_CreateYUVOverlay(pCodecCtx->width,
 pCodecCtx->height,
 SDL_YV12_OVERLAY,
 screen);


  // Read frames and save first five frames to disk
  i=0;
  while(av_read_frame(pFormatCtx, &packet)>=0) {
    // Is this a packet from the video stream?
    if(packet.stream_index==videoStream) {
      // Decode video frame
      avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, //avcodec_decode_video
  &packet );//packet.data, packet.size
      
      // Did we get a video frame?
      if(frameFinished) {
SDL_LockYUVOverlay(bmp);

AVPicture pict;
pict.data[0] = bmp->pixels[0];
pict.data[1] = bmp->pixels[2];
pict.data[2] = bmp->pixels[1];

pict.linesize[0] = bmp->pitches[0];
pict.linesize[1] = bmp->pitches[2];
pict.linesize[2] = bmp->pitches[1];

// Convert the image into YUV format that SDL uses
//img_convert(&pict, PIX_FMT_YUV420P,
    //               (AVPicture *)pFrame, pCodecCtx->pix_fmt, 
//    pCodecCtx->width, pCodecCtx->height);

img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height,  pCodecCtx->pix_fmt, 
                             pCodecCtx->width, pCodecCtx->height,  PIX_FMT_YUV420P, 
 SWS_BICUBIC, NULL, NULL, NULL);     
sws_scale(img_convert_ctx, (const uint8_t* const*)pFrame->data, pFrame->linesize,  0, 
      pCodecCtx->height, pict.data, pict.linesize);

SDL_UnlockYUVOverlay(bmp);

rect.x = 0;
rect.y = 0;
rect.w = pCodecCtx->width;
rect.h = pCodecCtx->height;


SDL_DisplayYUVOverlay(bmp, &rect);
      
      }
    }
    
    // Free the packet that was allocated by av_read_frame
    av_free_packet(&packet);
    SDL_PollEvent(&event);
    switch(event.type) {
    case SDL_QUIT:
      SDL_Quit();
      exit(0);
      break;
    default:
      break;
    }

  }
  
  // Free the YUV frame
  av_free(pFrame);
  
  // Close the codec
  avcodec_close(pCodecCtx);
  
  // Close the video file
  av_close_input_file(pFormatCtx);
  
  return 0;
}


在工程目录下面分别有ffmpeg的库和SDL的开发库,在Properities中的C/C++和Input都加了目录和附加库,编译的时候出现如下问题,甚是不解:
1>tutorial02.obj : error LNK2019: unresolved external symbol _av_free_packet referenced in function _SDL_main
1>tutorial02.obj : error LNK2019: unresolved external symbol _avcodec_decode_video2 referenced in function _SDL_main
1>C:\Users\User\Desktop\tutorial02\Debug\tutorial02.exe : fatal error LNK1120: 2 unresolved externals

av_free_packet函数并不是SDL_main.h中的,而是avcodec.h中的,求高手指导!

[解决办法]
一个error LNK2019:有关问题不懂就把错误提示谷歌一下就行了 
[解决办法]
还是库包含不对,可以查看一下该库的使用说明,使用第三方库需要头文件和库文件,而且路径都要正确。

热点排行