2017-10-08 4 views
0

ffmpegライブラリが静的ライブラリとして "baked in"されている共有ライブラリを作成しようとしています。静的にffmpegを含む共有ライブラリを作成する

次のディレクトリスキーマ考えてみましょう:私は長い道のりを歩んできました(Including objects to a shared library from a C++ archive (.a)を参照)、ライブラリはこれでOKコンパイル

include/ 
    my own .h files 
    ext/ 
    ffmpeg .h files 
lib/ 
    libav*.a archive files (softlinks to the actual .a files) 
    libValkka.so (my shared library) 
test/ 
    mytest.cpp 
bin/ 
    (binaries appear here) 

を:([STUFF]は簡潔にするため省略されている)

/usr/bin/C++ -fPIC -std = C++ 14 -pthread -I/usr/include/libdrm -g -shared -Wl、-soname、libValkka.so -o lib/libValkka。 CMakeFiles/Valkka.dir/src/avthread.cpp.o CMakeFiles/Valkka.dir/src/opengl.cpp.o CMakeFiles/Valkka.dir/src/openglthread.cpp.o [STUFF] CMakeFiles/Valkka.dir/src /filters.cpp.o -lX1 1 -lGLEW -lGLU -lGL -Wl、 - 複数定義可能-Wl、-Bsymbolic -Wl、 - 全アーカイブ-Wreorder lib/libavdevice.a lib/libavfilter.a lib/libavformat.a lib/libavcodec .Aのlib/libにlibavutil.a/libswscale.aのlib/libswresample.a -Wl、 - 彼らのソースコードは、任意のffmpegのAPIを使用していません(単に - 実行可能ファイルを作成するとき

がしかし、無全アーカイブ私自身のAPI) - で:

C++ -std = C++ 14 -pthread -Iinclude -Iinclude/-llib EXTテスト/ mytest.cpp -lValkka -g -oビン/ MyTestに

私はffmpegの依存関係が欠落していることに関するエラーの蓄積。いないすべてのものは、単にいくつかの奇妙なものが欠落しています。

lib/libValkka.so: undefined reference to `pa_stream_get_index' 
lib/libValkka.so: undefined reference to `deflateInit_' 
lib/libValkka.so: undefined reference to `pa_stream_get_state' 
lib/libValkka.so: undefined reference to `lzma_stream_decoder' 
lib/libValkka.so: undefined reference to `BZ2_bzDecompress' 
lib/libValkka.so: undefined reference to `vaInitialize' 
lib/libValkka.so: undefined reference to `pa_stream_unref' 
lib/libValkka.so: undefined reference to `deflateInit2_' 
lib/libValkka.so: undefined reference to `snd_pcm_close' 
... 
lib/libValkka.so: undefined reference to `vaGetDisplayDRM' 
lib/libValkka.so: undefined reference to `vaMaxNumEntrypoints' 
lib/libValkka.so: undefined reference to `uncompress' 
lib/libValkka.so: undefined reference to `pa_stream_drop' 
lib/libValkka.so: undefined reference to `pa_context_connect' 
lib/libValkka.so: undefined reference to `FT_Get_Kerning' 
lib/libValkka.so: undefined reference to `ass_free_track' 
lib/libValkka.so: undefined reference to `pa_operation_unref' 
lib/libValkka.so: undefined reference to `FT_Stroker_Done' 
lib/libValkka.so: undefined reference to `vaTerminate' 
lib/libValkka.so: undefined reference to `ass_new_track' 
lib/libValkka.so: undefined reference to `jack_client_close' 
... 
lib/libValkka.so: undefined reference to `xcb_xfixes_query_version' 
lib/libValkka.so: undefined reference to `xcb_shape_rectangles' 
lib/libValkka.so: undefined reference to `pa_mainloop_free' 
lib/libValkka.so: undefined reference to `snd_device_name_hint' 
lib/libValkka.so: undefined reference to `vaCreateImage' 
lib/libValkka.so: undefined reference to `vaBeginPicture' 
lib/libValkka.so: undefined reference to `DtsSetColorSpace' 
lib/libValkka.so: undefined reference to `vaDestroyConfig' 
lib/libValkka.so: undefined reference to `pa_stream_writable_size' 
lib/libValkka.so: undefined reference to `snd_pcm_hw_params_get_buffer_size_max' 
lib/libValkka.so: undefined reference to `ass_read_file' 

これはかなりイライラさせられる、私はそれらの名前が共有ライブラリに含まれていることを見ることができる場合は特に...!

nm lib/libValkka.so |

ます。grep "vaBeginPicture"

は、私はそれが依存関係の順序アーカイブ.Aファイルに関する問題かもしれないと思った、ともしてみました

など

U vaBeginPicture

を与えます

..... -Wl、 - 複数定義-Wl、-Bsymbolic -Wl、 - 開始グループ-Wl、 - 全アーカイブ-Wreorder lib/libavdevice.a lib /libavfilter.a lib/libavformat.a lib/libavcodec.a lib/libavutil.a lib/libswscale.a lib/libswresample.a -Wl、 - no-whole-archive -Wl、 - エンドグループ

しかし、問題は解決しません。

でない共有ライブラリを作成しました。これらの.aアーカイブを "焼く"ことはできません。つまり、ffmpegライブラリに動的に依存するだけです。このような問題はありません。

私は困惑しています。私は何か基本的なことを誤解していましたか、迷惑なリンクオプションを忘れましたか、あるいはその両方ですか?ヘルプは高く評価しました!実行可能ファイルを作成する際に未解決のシンボルを無視するリンカーを伝える

答えて

2

あなたはffmpegので必要とされるサードパーティ/システムライブラリを使用して共有ライブラリをリンクする必要があります。libbz2、libva、libxcb、libass、freetype2のなど実際のリストは、アーティファクト(automakeはの.PCファイル)を構築/ ffmpegの分布のどこかにあるべき

ignore-allは良い考えではありません。アプリケーションが正常に実行される可能性がありますが、未解決の項目は依然として存在します。それらのいずれかに当たるとすぐにクラッシュします。私の推測では、あなたが使用していない可能性があるlibavdeviceのためであるが、それでもなお悪い考えであるため、ほとんどの人がヒットすることはないだろう。また、実際にlibavdeviceライブラリが必要かどうかを確認します。必要なライブラリのリストを削除すると、必要なライブラリの一覧がかなりトリミングされます。

+0

libavdeviceを削除しようとしましたが、問題が解決されませんでした。だから、静的にコンパイルされた ".a"アーカイブ(共有ライブラリに焼いたもの)から別のライブラリへの参照は壊れてしまいます。つまり、チェーン内に静的ライブラリがある場合は、「依存関係チェイン」が壊れます。ここでいくつかの議論.. https://stackoverflow.com/questions/7841920/how-do-static-libraries-do-linking-to-dependencies .. ffmpegのconfigureスクリプトのヒント依存関係? –

+0

静的ライブラリとしてのffmpegは、アーカイブファイルに明示的に存在しない他のライブラリに多くの依存関係があります。外部参照を持つ静的ライブラリの場合です。あなたが壊れた依存関係を意味するのでしょうか?とにかく、共有ライブラリをそれらの依存関係と手動でリンクする必要があります(またはautomake/cmake /あなたのためにできるようなビルドシステムを使用してください)。 libavdeviceを削除してもそれらの依存関係はすべて削除されませんが、少なくともいくつかは削除されます(少なくともjack、oss、pulseaudio)。あなたはほとんどのライブラリを使わなくてもffmpegを作ることができますが、かなり小さいビルドになるでしょう –

+0

私の共有ライブラリを作るときには、 "-L"と "-l" 、vdpau-thingiesなど?オクラシ! –

0

は、トリックを行います。

C++ -std = C++ 14 -pthread -Iinclude -Iinclude/EXT -llib試験/ mytest.cpp -lValkkaを - g -o bin/mytest -Wl、 - 未解決シンボル=無視 - すべて

実行可能ファイルもOKです。

しかし、このようなリンカーフラグを使用すると、間違った方法で私を擦ります。おそらく、より良い選択肢がありますか?そしてなぜそれらのシンボルが最初に見つからないのですか?アンドレイの提案に続き

EDIT

、私はffmpegののconfigureスクリプトの助けを借りて、ffmpegのからすべての外部ライブラリを剥奪。それは少し厄介なプロセスでしたので、私はそれを自動的に行う素敵なpythonスクリプトを作成しました。それは少し過度のかもしれませんが、ここに行く:

#!/usr/bin/python3 
""" 
* Creates script "run_configure.bash" that launches ffmpeg's "configure" script with correct parameters (enabling/disabling stuff) 
* Run in the same directory where you have ffmpeg's configure script 
""" 
import subprocess 
import os 
import re 

def features(switch, adstring="", remove=[]): 
    p=subprocess.Popen(["./configure",switch],stdout=subprocess.PIPE) 
    st=p.stdout.read() 
    fst="" 
    for s in st.split(): 
    ss=s.decode("utf-8") 
    ok=True 
    for rem in remove: 
     if (ss.find(rem)!=-1): 
     ok=False 
    if ok: fst+=adstring+ss+" " 
    return fst 


def disable_external(): 
    p=subprocess.Popen(["./configure","-h"],stdout=subprocess.PIPE) 
    st=p.stdout.read().decode("utf-8") 

    # find some text tags from the configure output: 
    # i1=st.find("External library support:") 
    i1=st.find("themselves, not all their features will necessarily be usable by FFmpeg.") 
    i2=st.find("Toolchain options:") 
    st=st[i1:i2] 
    """ # debugging .. 
    print(st) 
    stop 
    """ 
    p=re.compile('--(enable|disable)-(\S*)') 
    switches=[] 
    for sw in p.findall(st): 
    if (sw[1] not in switches): 
     # print(sw[1]) # debugging 
     switches.append(sw[1]) 
    fst="" 
    for sw in switches: 
    fst+="--disable-"+sw+" " 
    return fst 

st ="./configure " 
st+="--disable-everything --disable-doc --disable-gpl --disable-pthreads --enable-static --enable-shared " 
st+= disable_external() 
st+= features("--list-decoders",adstring="--enable-decoder=", remove=["vdpau","crystalhd","zlib"]) 
st+= features("--list-muxers", adstring="--enable-muxer=") 
st+= features("--list-demuxers",adstring="--enable-demuxer=") 
st+= features("--list-parsers", adstring="--enable-parser=") 

f=open("run_configure.bash","w") 
f.write("#!/bin/bash\n") 
f.write(st+"\n") 
f.close() 
os.system("chmod a+x run_configure.bash") 
print("\nNext run ./run_configure.bash\n") 

""" 
For cleaning up .a and .so files, use 
find -name *.a -exec ls {} \; 
find -name *.so* -exec ls {} \; 
""" 

うまくいけば、誰かがそれが有用であることを願っています。 python3で実行します。

関連する問題