分析問題原因
我們在開發時會經常遇到“某個檔案未定義”的錯誤:

如上圖所示,我在學習ffmpeg開發的時候,明明是跟著視頻一步一步的走的,老師的視頻中是很順利的,而我自己操作的代碼,卻無論如何都編譯不過去,報錯如上圖所示,
先說一下我ffmpeg的安裝步驟;
1、打開 http://ffmpeg.org/download.html
2、直接復制了官網下載首頁的克隆git代碼的地址,然后進行編譯安裝了

一切命令列的操作都沒有問題,
當使用C語言開發ffmpeg操作檔案的時候,出現了問題,
最初的代碼如下:
zh@zh-lpc:~/project/ffmpeg$ cat ff.c
#include <stdio.h>
#include <libavutil/log.h>
//#include <libavformat/avio.h>
#include <libavformat/avformat.h>
int main()
{
char *fileName="./test.txt";
int ret;
ret=avpriv_io_delete(fileName);
if(ret < 0)
{
av_log(NULL,AV_LOG_ERROR,"Fail to delete file %s \n",fileName);
return -1;
}
return 0;
}
zh@zh-lpc:~/project/ffmpeg$
編譯時遇到:

就在ffmpeg安裝目錄中查找是否存在包含這個函式的檔案:
結果,都沒有
zh@zh-lpc:~/project/ffmpeg$ grep -nr "avpriv_io_delete" /usr/local/ffmpeg
zh@zh-lpc:~/project/ffmpeg$
zh@zh-lpc:~/project/ffmpeg$
zh@zh-lpc:~/project/ffmpeg$ cat /usr/local/ffmpeg/include/libavformat/avformat.h |grep "avpriv_io_delete"
zh@zh-lpc:~/project/ffmpeg$
看網友說“avpriv_io_delete”函式在avio.h檔案中,就查找了下,結果還是沒有:
zh@zh-lpc:~/project/ffmpeg$ cat /usr/local/ffmpeg/include/libavformat/avio.h |grep "avpriv_io_delete"
zh@zh-lpc:~/project/ffmpeg$
很無奈,就猜想是自己編譯的代碼肯定存在問題的,
想著ffmpeg這么正規,肯定有很詳細的api檔案,或者其他檔案說明,
就在官方查找了一番,

果然看到了API Documentation欄目,
可以查看自己想查看的版本的api,
我就查看了4.1版本的:
http://ffmpeg.org/doxygen/4.1/index.html


在avformat.h檔案中查找了一下,也是沒有的:

就打開了avio.h檔案:

搜索了下,果然相關的函式都存在:

解決辦法
既然4.1版本中存在這個函式,那么我只要重新下載4.1版本的代碼,然后重新編譯安裝就行了唄,
這樣還是挺麻煩的,因為是git,可以利用切換分支來解決版本的問題,
想切換分支,首先需要找到4.1版本的id是多少,
再次打開官網中的Download界面,然后進入git中的Browse界面中

地址:
https://git.ffmpeg.org/gitweb/ffmpeg.git
直接選擇4.1.x的某個版本進入commit中

在此可以看到提交的commit id:
commit 4521700f295f35da4768f88b570e0836a858ce7b
tree 53e22f7d49cc946c635373d32abfa556961067ed
parent 2f54cd9548e2a8fe0ecba9a345b66f0798dd243e

然后進入到自己的ffmpeg的存放目錄中,使用如下命令切換分支:
git switch -c 2f54cd9548e2a8fe0ecba9a345b66f0798dd243e
切換后,可以使用git log查看是否切換成功,并當前處在哪個上面:

然后就是重新編譯和安裝,
可以參考的之前寫的:
https://truedei.blog.csdn.net/article/details/120188699
驗證
可以看到現在已經有了
zh@zh-lpc:~/project$ cat /usr/local/ffmpeg/include/libavformat/avformat.h |grep "avpriv_io_delete"
zh@zh-lpc:~/project$
zh@zh-lpc:~/project$
zh@zh-lpc:~/project$ cat /usr/local/ffmpeg/include/libavformat/avio.h |grep "avpriv_io_delete"
int avpriv_io_delete(const char *url);
zh@zh-lpc:~/project$
重新編譯執行也成功了:
zh@zh-lpc:~/project/ffmpeg$ gcc -g ff.c -o ff -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -lavformat -lavutil
zh@zh-lpc:~/project/ffmpeg$
zh@zh-lpc:~/project/ffmpeg$
zh@zh-lpc:~/project/ffmpeg$ ls
ff ff.c ffmpeg_file.c hello helloword.c
zh@zh-lpc:~/project/ffmpeg$
zh@zh-lpc:~/project/ffmpeg$ touch test.txt
zh@zh-lpc:~/project/ffmpeg$
zh@zh-lpc:~/project/ffmpeg$ ls
ff ff.c ffmpeg_file.c hello helloword.c test.txt
zh@zh-lpc:~/project/ffmpeg$
zh@zh-lpc:~/project/ffmpeg$ ./ff
zh@zh-lpc:~/project/ffmpeg$
zh@zh-lpc:~/project/ffmpeg$ ls
ff ff.c ffmpeg_file.c hello helloword.c
zh@zh-lpc:~/project/ffmpeg$
測驗了一下,頭檔案寫"libavformat/avio.h"和"libavformat/avformat.h"都是可以的:
因為avformat.h中包含了avio.h頭檔案,
#include <stdio.h>
#include <libavutil/log.h>
//#include <libavformat/avio.h>
#include <libavformat/avformat.h>
int main()
{
char *fileName="./test.txt";
int ret;
ret=avpriv_io_delete(fileName);
if(ret < 0)
{
av_log(NULL,AV_LOG_ERROR,"Fail to delete file %s \n",fileName);
return -1;
}
return 0;
}
~
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/299372.html
標籤:其他
