2013-03-25 14 views
9

Ecco il mio problema:libav errore durante il collegamento: riferimenti undefined

  • Ho costruito ffmpeg dalla sorgente (versione 1.2), il libav * librerie sono in// lib usr local/e sono statici
  • I sto compilando un modulo ns3 (www.nsnam.org), quindi il mio unico controllo sul linker è tramite la variabile env LINKFLAGS
  • Nella sorgente le intestazioni sono in un blocco "extern C", quindi non è il solito g ++ nome mangling
  • Ho impostato LINKFLAGS = "- I/usr/local/include/libavformat -I/usr/local/include/libavcodec -I/usr/local/include/l ibavutil -L/usr/local/lib -lavformat -lavcodec -lavutil ", e il linker non sembra trovare nessuna delle funzioni di libav * che chiamo (ho un sacco di" riferimento non definito "e quindi" collect2: error : ld ha restituito lo stato 1 "

Qualcuno può aiutarmi? Grazie ...

edit: qui ci sono alcuni dei messaggi di riferimento indefiniti:

./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_guess_format' 
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_read_frame' 
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `avformat_write_header' 
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_interleaved_write_frame' 
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_find_stream_info' 
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_register_all' 
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_init_packet' 
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `avformat_alloc_context' 
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_dump_format' 
    ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `avio_close' 

Edit2: qui è il messaggio che ottengo dopo "generazione non riuscita":

-> task in 'scratch-simulator' failed (exit status 1): 
{task 53952272: cxxprogram scratch-simulator.cc.1.o -> scratch-simulator} 
['/usr/bin/g++', '-I/usr/local/include/libavcodec', '-I/usr/local/include/libavformat/', 
'-I/usr/local/include/libavutil/', '-L/usr/local/lib', '-I/usr/local 
/include/libavcodec', '-I/usr/local/include/libavformat/', '-I/usr/local/include 
/libavutil/', '-L/usr/local/lib', '-pthread', '-pthread', '-Wl,-z,relro', 
'scratch/scratch-simulator.cc.1.o', '-o', '/home/fede/Thesis/ns-allinone-3.14.1 
/ns-3.14.1/build/scratch/scratch-simulator', '-Wl,-Bstatic', '-Wl,-Bdynamic', 
'-Wl,--no-as-needed', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', 
'-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', 
'-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', 
'-L.', '-L.', '-L.', '-L.', '-L.', '-L/usr/lib', '-lns3.14.1-test-debug', '-lns3.14.1- 
csma-layout-debug', '-lns3.14.1-point-to-point-layout-debug', '-lns3.14.1-netanim- 
debug', '-lns3.14.1-lte-debug', '-lns3.14.1-spectrum-debug', '-lns3.14.1-antenna- 
debug', '-lns3.14.1-aodv-debug', '-lns3.14.1-dsdv-debug', '-lns3.14.1-dsr-debug', 
'-lns3.14.1-mesh-debug', '-lns3.14.1-olsr-debug', '-lns3.14.1-csma-debug', '-lns3.14.1- 
wimax-debug', '-lns3.14.1-applications-debug', '-lns3.14.1-virtual-net-device-debug', 
'-lns3.14.1-uan-debug', '-lns3.14.1-energy-debug', '-lns3.14.1-flow-monitor-debug', 
'-lns3.14.1-nix-vector-routing-debug', '-lns3.14.1-tap-bridge-debug', '-lns3.14.1- 
visualizer-debug', '-lns3.14.1-internet-debug', '-lns3.14.1-bridge-debug', '-lns3.14.1- 
point-to-point-debug', '-lns3.14.1-mpi-debug', '-lns3.14.1-wifi-debug', '-lns3.14.1- 
buildings-debug', '-lns3.14.1-propagation-debug', '-lns3.14.1-mobility-debug', 
'-lns3.14.1-config-store-debug', '-lns3.14.1-tools-debug', '-lns3.14.1-stats-debug', 
'-lns3.14.1-emu-debug', '-lns3.14.1-topology-read-debug', '-lns3.14.1-network-debug', 
'-lns3.14.1-qoe-monitor-debug', '-lns3.14.1-core-debug', '-lrt', '-lgsl', 
'-lgslcblas', '-lm', '-ldl', '-lgtk-x11-2.0', '-lgdk-x11-2.0', '-latk-1.0', 
'-lgio-2.0', '-lpangoft2-1.0', '-lpangocairo-1.0', '-lgdk_pixbuf-2.0', '-lcairo', 
'-lpango-1.0', '-lfreetype', '-lfontconfig', '-lgobject-2.0', '-lglib-2.0', '-lxml2', 
'-lpython2.7'] 
+0

Quali sono alcuni dei riferimenti indefiniti? Puoi verificare che vivano nella libav * .a? Inoltre, i flag '-I' sono applicabili al tempo di compilazione; puoi lasciarli fuori dalla variabile LINKFLAGS. Un'altra idea: verifica che il linker stia onorando LINKFLAG inserendo qualcosa di fasullo come "-lblahblah". A meno che tu non abbia davvero un libblahblah.a sul tuo sistema, il linker dovrebbe lamentarsi che non riesce a trovare la libreria. –

+0

Il linker si lamenta se aggiungo una libreria fasulla in LINKFLAGS. Quando ho chiamato nm mux.o (mux.c è il file sorgente alcune delle funzioni che chiamo sono in), ottengo funzioni con il flag T e funziona con il flag U, ma entrambi i tipi sono "riferimenti non definiti". Ad esempio, avformat_write_header appare con un T e av_guess_format appare con una U, ma ottengo sia un "riferimento non definito a avformat_write_header" che un "riferimento non definito a av_guess_format" – Fedech

+0

Grazie per aver fornito più dati-- solo facendo due diligence per ottenere un sentirsi per il proprio ambiente. Quando si esegue 'nm /usr/local/lib/libavformat.a | grep avformat_write_header ', la funzione appare lì con una' T 'e un indirizzo? Questa è la libreria in cui dovrebbe essere pubblicata (e la funzione viene visualizzata nella mia copia locale). –

risposta

21

Le librerie sono C. Le intestazioni della libreria non includono un extern "C" quando compilato come C++. Fate questo in vostro C++ fonte:

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

Oppure, più genericamente, per la C e C++ misto fonte:

#ifdef __cplusplus 
extern "C" { 
#endif 
#include <libavcodec/avcodec.h> 
#include <libavformat/avformat.h> 
#ifdef __cplusplus 
} 
#endif 

E si dovrebbe andare bene.

1

Ho riscontrato questo problema con av_find_stream_info e il problema era che questa funzione era obsoleta. Il problema era che avevo due installazioni ffmpeg sulla scatola, e leggevo l'intestazione da un'installazione e usavo librerie da installazioni diverse.

Dopo aver rimosso la libreria predefinita di sistema, il problema è stato risolto.

UPDATE: Per Ubuntu ho seguente:

$ sudo dpkg -r libavcodec53 
$ sudo dpkg -r libavformat53 
$ sudo dpkg -r libavutil51 
$ sudo dpkg -r libswscale2 
+0

Ciao, Come hai rimosso la libreria predefinita di sistema? Intendo dove trovarli? – user2452253

+1

Ho riscontrato questo problema su Ubuntu e ho rimosso i pacchetti ffmpeg usando 'dpkg -r'. Aggiornato la mia risposta con set di comandi –

1

appena incontrato questa domanda nella mia ricerca.

Nel sistema di costruzione waf, è necessario utilizzare STLIB e STLIBPATH per indicare il nome e il percorso della libreria statica, anziché utilizzare LINKFLAGS. Si noti che è necessario impostare STLIB nell'elenco dei nomi di librerie statiche da utilizzare senza prefisso o estensione.

Nel file di wscript, aggiungere

conf.env.append_value("STLIBPATH", ["/usr/local/lib"]) 
conf.env.append_value("STLIB", ["av*,av**"]) 
Problemi correlati