1. 程式人生 > >靜態連結ffmpeg庫

靜態連結ffmpeg庫

ffmpeg靜態連結

在音訊視訊編解碼中,經常使用ffmpeg庫。平時都是使用的動態庫,但是動態庫有一個缺點,就是程式執行時才進行載入。如果你需要經常移植的情況下,每次都需要重新的編譯動態庫,比較麻煩。並且,如果你使用的庫只有你自己的程式使用時,那麼系統只會有一個副本,所以動態庫的優點並沒有體現出來,倒不如使用靜態庫省事。
但是直接修改原來的makefile以後,發現並不能正常執行,連結時候出現了很多undefined reference to的錯誤,差了很多資料以後,發現了問題主要是下面這種原因:

  • 連結時候,需要指定目錄,目錄下不要存在動態庫,在linux系統中,程式會優先連結動態庫。
  • 多個庫的連結順序的問題,這點很重要,動態庫不會存在這個問題
  • 版本問題,ffmpeg的版本相容是一個很大的問題
  • 標頭檔案要include準確

對於視訊解碼,我修改以後的makefile如下所示:

  1 CC = g++
  2 Cflag = -g
  3 SRC = $(wildcard *.cpp)
  4 OBJS = $(patsubst %cpp, %o, $(SRC))
  5 HEADER = $(wildcard ../include/*.h)
  6 Lib = -lavformat -lavdevice -lavcodec -lavutil -lpthread -lswscale -lswresample  -lz -lm -lbz2 -llzma                                                                 
  7
Lib2=-ldl -lrt 8 Path = ~/simpleffmpeg/lib 9 INCLUDE = ~/simpleffmpeg/include 10 Target = vfilter 11 12 all: $(Target) 13 14 %.o:%.cpp $(HEADER) 15 $(CC) $(Cflag) -c $< -o [email protected] -I ../include $(INCLUDE) 16 17 $(Target):$(OBJS) 18 $(CC) $(Cflag) -o [email protected]
$^ -L$(Path) $(Lib) $(Lib2) 19 20 .PHONY:clean 21 22 clean: 23 rm -f *.o $(Target)

其中ffmpeg的連結順序取決於程式碼中使用的順序。並且你需要新增-lm -lz -lpthread -lswresample -ldl -lrt等選項。
如果出現下面的錯誤:

undefined reference to `BZ2_bzDecompressInit'

需要新增-lbz2選項

undefined reference to `lzma_stream_decoder'

需要新增-llzma選項

加入以上選項以後,經過編譯,生成的可執行檔案一下子增加了70M,這樣在使用ldd 選項看的時候,發現並不會依賴ffmpeg了,目標get√。

    linux-vdso.so.1 =>  (0x00007fffa13fe000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f543a140000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f5439f27000)
    libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f5439d16000)
    liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f5439af4000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f54398f0000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f54396e7000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f54393e3000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f54390dd000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5438ec6000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5438b01000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f543a37e000)

相關推薦

靜態連結ffmpeg

ffmpeg靜態連結 在音訊視訊編解碼中,經常使用ffmpeg庫。平時都是使用的動態庫,但是動態庫有一個缺點,就是程式執行時才進行載入。如果你需要經常移植的情況下,每次都需要重新的編譯動態庫,比較麻煩。並且,如果你使用的庫只有你自己的程式使用時,那麼系統只會有

靜態連結ffmpeg注意的問題

1. 最近使用ffmpeg靜態庫進行連結,提示 undefined reference,排查發現靜態庫的順序導致的,靜態庫對先後順序有嚴格要求 2. 使用ffmpeg庫時,在連結時,需要加上-lm -

ffmpeg 靜態連結第三方

動態(共享)連結庫自是有諸多優於靜態連結庫的特點:如能共享記憶體空間; 節約整個系統的儲存空間,從而使整個系統速度提高; 當只有某個動態連結庫有更新時--便於維護--只用更新這個庫。   但在有些情況下,如,伺服器並不是你一個人獨享;伺服器上不止有一個版本的ffmpeg要用

ffmpeg編譯的靜態連結問題

安裝了ffmpeg在wince編譯生成dll和.a檔案,但是發現這個.a檔案並不是像win32下面的lib檔案,不能夠直接呼叫,如果直接呼叫會產生error LNK2001: unresolved external sy

(轉)靜態編譯,動態編譯,靜態連結,動態連結

1.定義 LIB檔案中包含函式程式碼本身,在編譯時直接將程式碼加入程式當中。稱為靜態連結庫static link library。 LIB包含了函式所在的DLL檔案和檔案中函式位置的資訊(入口),程式碼由執行時載入在程序空間中的DLL提供,稱為動態連結庫dynamic link libr

C語言函式:動態連結靜態連結

首先,函式庫就是一些事先寫好的函式的集合,是別人分享的,我們可以拿來使用的。經過一些校準和整理,就形成一份標準化的函式庫。例如glibc 函式庫有兩種提供形式:動態連結庫與靜態連結庫 早起函式庫裡的函式都是直接共享的,就是所謂的開源社群。後來函式庫商業化,就出現了靜態連結庫與動態連結庫。

靜態連結的編譯與使用 linux下的動態連結靜態連結到底是個什麼鬼?(一)靜態連結的編譯與使用

linux下的動態連結庫和靜態連結庫到底是個什麼鬼?(一)靜態連結庫的編譯與使用       知識不等於技術,這句話真的是越工作的時間長越深有體會,學習到的知識只有不斷的實踐,才成真正在自已的心裡紮下根,成為自身的一部分,所以無論如何,我希望我的部落格可以

連結裝載與 第4章 靜態連結

靜態連結 /* a.c */ extern int shared; int main() { int a = 100; swap( &a, &shared); } /* b.c */ int shared = 1; void swap(int* a, i

關於原始檔,標頭檔案,靜態連結檔案,動態連結檔案的的理解

先從原始檔和標頭檔案的關係說起,由於是還是初學階段,只接觸了C++語言和windows平臺下的程式設計,所以只講這兩方面的東東, 標頭檔案的作用:對函式,變數,和類的宣告,其實在標頭檔案也可對一些特殊函式和變數定義,比如可以在標頭檔案中對行內函數和const型別變數定義,由於對類的宣告

GCC編譯過程與動態連結靜態連結(未整理)

來源:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/6410588.html 根據連結時期的不同,庫又有靜態庫和動態庫之分。靜態庫是在連結階段被連結的,所以生成的可執行檔案就不受庫的影響,即使庫被刪除,程式依然可以成功執行。而動態庫是在程式執行的時

靜態連結(LIB)和動態連結(DLL),DLL的靜態載入和動態載入,兩種LIB檔案。

靜態連結庫(LIB)和動態連結庫(DLL),DLL的靜態載入和動態載入,兩種LIB檔案。 一、 靜態連結庫(LIB,也簡稱“靜態庫”)與動態連結庫(DLL,也簡稱“動態庫”)的區別 靜態連結庫與動態連結庫都是共享程式碼的方式,如果採用靜態連結庫,則無論你願不願意,lib 中的指令都全部被直接包含在最

動態連結靜態連結的優缺點

轉載參考博文 1、靜態連結庫的優點: (1) 程式碼裝載速度快,執行速度略比動態連結庫快; (2) 只需保證在開發者的計算機中有正確的.LIB檔案,在以二進位制形式釋出程式時不需考慮在使用者的計算機上.LIB檔案是否存在及版本問題,可避免dll地獄等問題。 2 、動態連結庫的優點 (

C實現JAVA類似ArrayList的靜態連結

檔案結構: ArrayList.h:標頭檔案 ArrayList.c:實現標頭檔案中的功能 ArrayListTest.c:測試 ArrayList.h 標頭檔案的基本框架: #ifndef _ARRAYLIST_H #define _ARRAYLIST_H /

Linux中,.a和.so,其實就是靜態連結與動態連結

詳細查了一下,.a與.so的區別,其實就是靜態連結庫與動態連結庫。有一篇博文,很詳細,附上鍊接:http://blog.csdn.net/nieyinyin/article/details/6890557   Linux下的.so是基於Linux下的動態連結,其功能和作用類

linux 把靜態連結.a連結到動態連結.so裡

個人分類: linux編譯連結         最近公司的專案中突然出現了這樣一個需求,我簡化再概括後如下:有兩大模組,其中一個模組a最終編譯出一個可執行檔案exec_a,另一個模組b編譯出一個動態連結庫lib_b.so被模組a的程式exec_a所連結。現在模組b中分出

如何製作vc6靜態連結的IDA SIG檔案

網上有製作vc靜態連結庫的IDA SIG檔案的文章,但是他針對的是VC7, 並且給出的指令碼有一點小問題,我基於他的基礎做了部分修改: 1. 把vc6下的libc.lib 拷貝到flair61\bin路徑下,這樣執行prf,sigmake就不用再指定長長的路徑 2.嘗試用

動態連結靜態連結的相互包含問題及實現

動態連結庫和靜態連結庫的基本概念請參考 1.《深入理解計算機系統》第七章連結 2.《程式設計師的自我修養》第4章 靜態連結和第7章 動態連結 3. http://blog.jobbole.com/86852/ 目的 為了封裝程式碼,簡化介面,我們要把已有應用程式碼封裝為

連結裝載與 第4章 靜態連結

靜態連結 /* a.c */ extern int shared; int main() { int a = 100; swap( &a, &shared); } /* b.c */ int shared = 1; void s

原始檔,標頭檔案,靜態連結檔案,動態連結檔案的的理解

如果你把一個.exe檔案只接放到沒有操作系充的“裸機”上去執行,顯然是執行不了的,可是你把這個程式放在一個裝有windows系統的電腦上就能運行了,顯然,程式的執行還是得依靠windows作業系統,這裡就要說到.dll檔案,上面說到的連結這一步時的程式碼複製只講到對程式作者自已寫的檔案和.lib檔案中用到的程

windows應用程式【三】靜態連結和動態連結

在寫c語言程式時,我們會呼叫標頭檔案 呢麼標頭檔案理論上一定有實現方法 我們可以去檢視標頭檔案一般在你安裝vc目錄下的/vc98/include 來看一下windows.h 但是我們發現windows.h中只是一些定義與宣告 呢麼我們再來看windows.h的標頭檔案 我們開啟wi