2012-04-09 4 views
1

J'ai un problème en essayant de construire mon programme, qui utilise une classe C++ pour dela avec des objets FFmpeg:Erreur bâtiment app

Undefined symbols for architecture armv7: 
    "__Z13avcodec_open2P14AVCodecContextP7AVCodecPP12AVDictionary", referenced from: 
     __Z10openStreamPKcb in RTPReader.o 
    "__Z21avcodec_decode_audio4P14AVCodecContextP7AVFramePiP8AVPacket", referenced from: 
     __Z13getStreamDataRPhRi in RTPReader.o 
    "__Z20avformat_close_inputPP15AVFormatContext", referenced from: 
     __Z11closeStreamv in RTPReader.o 
    "__Z21avformat_network_initv", referenced from: 
     __Z10openStreamPKcb in RTPReader.o 
    "__Z26avcodec_get_frame_defaultsP7AVFrame", referenced from: 
     __Z13getStreamDataRPhRi in RTPReader.o 
    "__Z15av_register_allv", referenced from: 
     __Z10openStreamPKcb in RTPReader.o 
    "__Z19av_find_best_streamP15AVFormatContext11AVMediaTypeiiPP7AVCodeci", referenced from: 
     __Z10openStreamPKcb in RTPReader.o 
    "__Z14av_free_packetP8AVPacket", referenced from: 
     __Z13getStreamDataRPhRi in RTPReader.o 
     __Z11closeStreamv in RTPReader.o 
    "__Z6av_logPviPKcz", referenced from: 
     __Z10openStreamPKcb in RTPReader.o 
     __Z13getStreamDataRPhRi in RTPReader.o 
    "__Z19avformat_open_inputPP15AVFormatContextPKcP13AVInputFormatPP12AVDictionary", referenced from: 
     __Z10openStreamPKcb in RTPReader.o 
    "__Z26av_samples_get_buffer_sizePiii14AVSampleFormati", referenced from: 
     __Z13getStreamDataRPhRi in RTPReader.o 
    "__Z19avcodec_alloc_framev", referenced from: 
     __Z13getStreamDataRPhRi in RTPReader.o 
    "__Z25avformat_find_stream_infoP15AVFormatContextPP12AVDictionary", referenced from: 
     __Z10openStreamPKcb in RTPReader.o 
    "__Z13av_read_frameP15AVFormatContextP8AVPacket", referenced from: 
     __Z13getStreamDataRPhRi in RTPReader.o 
ld: symbol(s) not found for architecture armv7 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

D'une certaine façon, il est addng un _Z préfixe ## à tous mes C++ méthodes , et je ne sais pas pourquoi, quelqu'un peut-il nous guider sur ce que le problème pourrait être ?, merci d'avance.

+0

Liez-vous les bibliothèques et les fichiers appropriés? Pouvez-vous ajouter la ligne de commande (ou une partie pertinente de votre Makefile) que vous utilisez pour construire l'application à votre question? –

Répondre

2

choses Al __Z le ## voyez-vous, est normal. Il est appelé 'name mangling' en C++, voir http://en.wikipedia.org/wiki/Name_mangling pour une bonne explication.

Je dois faire quelques suppositions ici, manquant d'informations plus détaillées (désolé, je ne peux pas encore commenter, seulement répondre). En regardant les documents api ffmpeg, il semble que FFmpeg a une API C, pas C++. Si tel est le cas, votre solution est peut-être pour envelopper tous #includes des fichiers FFmpeg avec extern « C », par exemple (voir http://developers.sun.com/solaris/articles/mixing.html pour explication):

extern "C" { 
    #include <someffmpegheader.h> 
} 

Quant à la raison échoue le lien, sont Vous liez-vous à une bibliothèque ffmpeg pré-compilée ou intégrez-vous les fichiers source ffmpeg dans votre projet? Si vous liez une bibliothèque, il se peut qu'elle ne contienne pas les architectures correctes. Si vous exécutez la commande suivante dans une fenêtre de terminal, elle vous indiquera les architectures disponibles dans la bibliothèque:

file libffmpeg.a 
+0

résolu! Merci beaucoup pour l'explication détaillée. –

+0

ne peut pas croire combien de fois j'ai fait cette erreur lors de la conversion de c en code d'appel C++, merci Stefan pour le rappel! (nom de la librairie googled mangling et boom était ici) –

0

Il me semble que cette bibliothèque était liée à extern "C", mais vous essayez de lier sans cette clause. Peut-être que vous prenez des fichiers. H d'une version, et des fichiers .LIB d'un tout autre.

Utiliser la clause extern "C" sur les fonctions importées - en C++ lorsque vous essayez les fonctions d'accès C à partir du code C++ Vous devez utiliser cette clause

+0

Merci, vous avez essentiellement raison. –