Undefined reference, using FFMpeg-Bibliothek (AvCodec) auf Ubuntu, 64-bit-system

Ich bin mit den Beispiel-code von der aktuellen FFMpeg-Bibliothek.
Ich habe eingefügt, der Beispiel-code in der Datei videofecencoder.c:

/*
* copyright (c) 2001 Fabrice Bellard
*
* This file is part of Libav.
*
* Libav is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* Libav is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"


#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#ifdef HAVE_AV_CONFIG_H
#undef HAVE_AV_CONFIG_H
#endif

#include "libavutil/imgutils.h"
#include "libavutil/opt.h"
#include "libavcodec/avcodec.h"
#include "libavutil/mathematics.h"
#include "libavutil/samplefmt.h"

#define INBUF_SIZE 4096
#define AUDIO_INBUF_SIZE 20480
#define AUDIO_REFILL_THRESH 4096

/*
* Video encoding example
*/
static void video_encode_example(const char *filename, int codec_id)
{
   AVCodec *codec;
   AVCodecContext *c= NULL;
   int i, out_size, size, x, y, outbuf_size;
   FILE *f;
   AVFrame *picture;
   uint8_t *outbuf;
   int nrOfFramesPerSecond  =25;
   int nrOfSeconds =1;


   printf("Video encoding\n");

   /* find the mpeg1 video encoder */
   codec = avcodec_find_encoder((CodecID) codec_id);
   if (!codec) {
       fprintf(stderr, "codec not found\n");
       exit(1);
   }

   c = avcodec_alloc_context3(codec);
   picture= avcodec_alloc_frame();

   /* put sample parameters */
   c->bit_rate = 400000;
   /* resolution must be a multiple of two */
   c->width = 352;
   c->height = 288;
   /* frames per second */
   c->time_base= (AVRational){1,25};
   c->gop_size = 10; /* emit one intra frame every ten frames */
   c->max_b_frames=1;
   c->pix_fmt = PIX_FMT_YUV420P;

   if(codec_id == CODEC_ID_H264)
       av_opt_set(c->priv_data, "preset", "slow", 0);

   /* open it */
   if (avcodec_open2(c, codec, NULL) < 0) {
       fprintf(stderr, "could not open codec\n");
       exit(1);
   }

   f = fopen(filename, "wb");
   if (!f) {
       fprintf(stderr, "could not open %s\n", filename);
       exit(1);
   }

   /* alloc image and output buffer */
   outbuf_size = 100000;
   outbuf = (uint8_t*) malloc(outbuf_size);

   /* the image can be allocated by any means and av_image_alloc() is
    * just the most convenient way if av_malloc() is to be used */
   av_image_alloc(picture->data, picture->linesize,
                  c->width, c->height, c->pix_fmt, 1);

   /* encode 1 second of video */
   int nrOfFramesTotal = nrOfFramesPerSecond * nrOfSeconds;

   /* encode 1 second of video */
   for(i=0;i < nrOfFramesTotal; i++) {
       fflush(stdout);
       /* prepare a dummy image */
       /* Y */
       for(y=0;y<c->height;y++) {
           for(x=0;x<c->width;x++) {
               picture->data[0][y * picture->linesize[0] + x] = x + y + i * 3;
           }
       }

       /* Cb and Cr */
       for(y=0;y<c->height/2;y++) {
           for(x=0;x<c->width/2;x++) {
               picture->data[1][y * picture->linesize[1] + x] = 128 + y + i * 2;
               picture->data[2][y * picture->linesize[2] + x] = 64 + x + i * 5;
           }
       }

       /* encode the image */
       out_size = avcodec_encode_video(c, outbuf, outbuf_size, picture);
       printf("encoding frame %3d (size=%5d)\n", i, out_size);
       fwrite(outbuf, 1, out_size, f);
   }

   /* get the delayed frames */
   for(; out_size; i++) {
       fflush(stdout);

       out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL);
       printf("write frame %3d (size=%5d)\n", i, out_size);
       fwrite(outbuf, 1, out_size, f);
   }

   /* add sequence end code to have a real mpeg file */
   outbuf[0] = 0x00;
   outbuf[1] = 0x00;
   outbuf[2] = 0x01;
   outbuf[3] = 0xb7;
   fwrite(outbuf, 1, 4, f);
   fclose(f);
   free(outbuf);

   avcodec_close(c);
   av_free(c);
   av_free(picture->data[0]);
   av_free(picture);
   printf("\n");
}

int main(int argc, char **argv)
{
   const char *filename;

   /* register all the codecs */
   avcodec_register_all();

   if (argc <= 1) {

       video_encode_example("/grb_1.mpg", CODEC_ID_MPEG1VIDEO);
   } else {
       filename = argv[1];
   }


   return 0;
}

Wenn ich gcc videofecencoder.cc -lavcodec bekomme ich folgende Fehlermeldungen:

/tmp/ccJg8IDy.o: In function `video_encode_example(char const*, int)':
videofecencoder.cc:(.text+0x35): undefined reference to `avcodec_find_encoder(CodecID)'
videofecencoder.cc:(.text+0x74): undefined reference to `avcodec_alloc_context3(AVCodec*)'
videofecencoder.cc:(.text+0x7d): undefined reference to `avcodec_alloc_frame()'
videofecencoder.cc:(.text+0x113): undefined reference to `av_opt_set(void*, char const*, char const*, int)'
videofecencoder.cc:(.text+0x12b): undefined reference to `avcodec_open2(AVCodecContext*, AVCodec*, AVDictionary**)'
videofecencoder.cc:(.text+0x1f0): undefined reference to `av_image_alloc(unsigned char**, int*, int, int, PixelFormat, int)'
videofecencoder.cc:(.text+0x35c): undefined reference to `avcodec_encode_video(AVCodecContext*, unsigned char*, int, AVFrame const*)'
videofecencoder.cc:(.text+0x3cf): undefined reference to `avcodec_encode_video(AVCodecContext*, unsigned char*, int, AVFrame const*)'
videofecencoder.cc:(.text+0x47c): undefined reference to `avcodec_close(AVCodecContext*)'
videofecencoder.cc:(.text+0x488): undefined reference to `av_free(void*)'
videofecencoder.cc:(.text+0x497): undefined reference to `av_free(void*)'
videofecencoder.cc:(.text+0x4a3): undefined reference to `av_free(void*)'
/tmp/ccJg8IDy.o: In function `main':
videofecencoder.cc:(.text+0x4c3): undefined reference to `avcodec_register_all()'
collect2: ld returnerade avslutningsstatus 1

Den Befehl nm libavcodec.a | grep avcodec_find Ergebnisse in:

00000000000008e0 T avcodec_find_best_pix_fmt
0000000000000740 T avcodec_find_best_pix_fmt2
                 U avcodec_find_encoder
0000000000002ca0 T avcodec_find_decoder
0000000000002cf0 T avcodec_find_decoder_by_name
0000000000002bd0 T avcodec_find_encoder
0000000000002c30 T avcodec_find_encoder_by_name

Ich habe auch noch eine ähnliche Fehlermeldung mit einer anderen Bibliothek:
Undefined reference trotz Verlinkung in OpenFEC-Bibliothek

Mein system: Ubuntu 11, 64-bit-Maschine

Mein Nächster Schritt ist zu versuchen, kompilieren Sie es auf VirtualBox mit Ubuntu 32 bit (läuft auf einem Windows-OS).

  • haben Sie versucht, die Verlinkung gegen die avutil-und avformat, wie gut?
  • Vielen Dank für deinen input! Die Fehlermeldung bleibt. Invoking: GCC C++ Linker g++ -L/home/anders/workspace/videolib/ -o "videofecencode" ./videofecencoder.o -lavcodec -lavutil -lavformat -lpthread ./videofecencoder.o: In Funktion video_encode_example': /home/anders/workspace/videofecencode/Debug/../videofecencoder.cc:208: undefined reference to avcodec_find_encoder(CodecID)' /home/anders/workspace/videofecencode/Debug/../videofecencoder.cc:214: undefined reference to `avcodec_alloc_context3(AVCodec*)' /home/anders/workspace/videofecencode/Debug(..)
  • können Sie Ihre gesamte Programm hier? Ich werde versuchen, den link, es selbst und sehen (arbeiten mit dem gleichen OS). Ich habe eine Menge von Projekten, die mit libav* aber es war lange her, und ich habe nicht die makefiles nicht mehr. Ich erinnere mich, es war ein bisschen knifflig, klappte aber schließlich. haben Sie versucht, die Einstellung -L um sicherzustellen, dass es die richtige libavcodec? nach einige Beispiel-fand ich, das Sie gerade brauchen "-lavformat -lavcodec -lz"
  • Haben Sie versucht, die g++ videofecencoder.cc -lavformat -lavcodec -lavutil? Die Reihenfolge, in der Sie versorgen die Bibliotheken zu verknüpfen, zu Fragen.
  • Hier ist der code für libavcodec: docs.google.com/document/d/... ich glaube, ich habe versucht, die '-L'-option. Ich bin versucht, den link der OpenFEC-Bibliothek in einem anderen Projekt in parallell, und hab '-L' entweder/beide Projekte.. ich bin jetzt die Installation von 32-bit Ubuntu auf der VirtualBox und sehen, ob es besser funktioniert mit dem verlinken der Bibliotheken.. ich habe nicht geschafft zu verlinken weder die Bibliothek noch OpenFEC ('undefined reference' in beiden Fällen). Vielen Dank für Ihre Hilfe!
  • Dein Vorschlag 'g++ videofecencoder.cc -lavformat -lavcodec -lavutil' Ergebnisse in die selbe Fehlermeldung: /tmp/ccJjyNby.o: In Funktion video_encode_example(char const*, int)': videofecencoder.cc:(.text+0x35): undefined reference to avcodec_find_encoder(CodecID)' videofecencoder.cc:(.text+0x74): undefined reference to `avcodec_alloc_context3(AVCodec*)'
  • hier ist die Ausgabe Einstellung -L: 'g++ videofecencoder.cc -L../videolib -lavformat -lavcodec -lavutil /tmp/cc9mf4gC.o: In Funktion video_encode_example(char const*, int)': videofecencoder.cc:(.text+0x35): undefined reference to avcodec_find_encoder(CodecID)' videofecencoder.cc:(.text+0x74): undefined reference to avcodec_alloc_context3(AVCodec*)' videofecencoder.cc:(.text+0x7d): undefined reference to avcodec_alloc_frame()' (..)'
  • Ich erstellt ein virtuelles system auf Ubuntu kompilierte FFMpeg; und verknüpft es mit meinen c++-Datei: g++ videofecencoder.cc -lavformat -lavcodec -lavutil ich bekomme immer noch den gleichen Fehler. Jetzt habe ich den gleichen Fehler mit zwei verschiedenen Installationen (eine durch VirtualBox; und eine installation mit Ubuntu Windows-installer von Ubuntu).

Schreibe einen Kommentar