2013-05-31 110 views
1

我這樣做了程序。C程序找不到包含在頭文件中的函數

1 #include <stdio.h> 
    2 #include <string.h> 
    3 #include <stdlib.h> 
    4 #include "libavformat/avformat.h" 
    5 
    6 int main (int argc, char* argv[]){ 
    7   av_register_all(); 
    8   return 0; 
    9 } 

我的頭文件位於

[email protected]:/home/juneyoungoh/getDuration# find/-name "avformat.h" 
/root/ffmpeg/libavformat/avformat.h 
/usr/local/include/libavformat/avformat.h 

然後我用gcc getDuration.c運行,但我的消息顯示如下圖所示。

[email protected]:/home/juneyoungoh/getDuration# gcc getDuration.c 
/tmp/ccwjonqH.o: In function `main': 
getDuration.c:(.text+0x10): undefined reference to `av_register_all' 
collect2: ld returned 1 exit status 

坦率地說,我不知道是什麼使這個。

感謝您的回答。

========================== edited#1 ================= ==========

當我「ls/usr/local/lib」,我得到這個。

[email protected]:/home/juneyoungoh/getDuration# ls /usr/local/lib/ 
libavcodec.a libavutil.a libopus.la  libvpx.a python2.7 
libavdevice.a libfdk-aac.a libpostproc.a libx264.a 
libavfilter.a libfdk-aac.la libswresample.a libyasm.a 
libavformat.a libopus.a  libswscale.a  pkgconfig 

您可以在最後一行的第一行看到libavformat.a。

因此,如果我命令你的建議,我會得到下面。

/root/ffmpeg/libavformat/vqf.c:244: undefined reference to `av_free_packet' 
/usr/local/lib//libavformat.a(vqf.o): In function `add_metadata': 
/root/ffmpeg/libavformat/vqf.c:58: undefined reference to `av_malloc' 
/root/ffmpeg/libavformat/vqf.c:64: undefined reference to `av_dict_set' 
/usr/local/lib//libavformat.a(vqf.o): In function `vqf_read_header': 
/root/ffmpeg/libavformat/vqf.c:148: undefined reference to `av_dict_set' 
/root/ffmpeg/libavformat/vqf.c:208: undefined reference to `av_log' 
/root/ffmpeg/libavformat/vqf.c:216: undefined reference to `av_malloc' 
/root/ffmpeg/libavformat/vqf.c:170: undefined reference to `av_log' 
/root/ffmpeg/libavformat/vqf.c:121: undefined reference to `av_log' 
/root/ffmpeg/libavformat/vqf.c:184: undefined reference to `av_log' 
/root/ffmpeg/libavformat/vqf.c:136: undefined reference to `av_log' 
/usr/local/lib//libavformat.a(wavenc.o): In function `wav_write_trailer': 
/root/ffmpeg/libavformat/wavenc.c:210: undefined reference to `av_rescale' 
/usr/local/lib//libavformat.a(wavenc.o): In function `wav_write_packet': 
/root/ffmpeg/libavformat/wavenc.c:181: undefined reference to `av_log' 

它太長了,所以我只是發佈一小部分。

我想了libavformat的所有鏈接已被打破,但我不知道

我能做些什麼來解決這個問題的鏈接。

我已經安裝了他們的官方鏈接說。

https://ffmpeg.org/trac/ffmpeg/wiki/UbuntuCompilationGuideQuantal

+0

我假設系統可以找到頭,因爲如果沒有它吐出消息,「沒有這樣的文件或目錄」,是我錯了嗎? –

+2

頭文件並不是庫。包括頭文件提供了函數聲明,但是你需要爲鏈接器指定一個庫來獲取定義。 –

+0

@WilliamPursell在這種情況下,庫名稱是「avformat」,頭文件是「avformat.h」,對吧? –

回答

0

我發現了什麼錯我的代碼(準確地說,不是代碼,但環境)。

要執行該代碼,我需要名爲「libavformat-dev」的額外庫。

就我而言,因爲我是Ubuntu 12.04用戶,所以我命令如下。

apt-get install libavformat-dev 

這樣對我的恥辱:(

0

你有一個鏈接錯誤;不是編譯錯誤。您需要使用-l選項指定庫文件。我覺得應該是:

gcc getDuration.c -lavformat 

如果它不能正常工作,指定了libavformat的位置,因爲

gcc -L/usr/local/lib getDuration.c -lavformat 
+0

謝謝,我嘗試過這種方式,但我收到了其他未定義的函數消息,如果需要,我可以發佈消息。 –

+0

是的,請發佈您收到的信息。還要檢查'/ usr/local/lib'中是否有'libavformat.a'庫, – unxnut