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ライブラリに動的に依存するだけです。このような問題はありません。
私は困惑しています。私は何か基本的なことを誤解していましたか、迷惑なリンクオプションを忘れましたか、あるいはその両方ですか?ヘルプは高く評価しました!実行可能ファイルを作成する際に未解決のシンボルを無視するリンカーを伝える
libavdeviceを削除しようとしましたが、問題が解決されませんでした。だから、静的にコンパイルされた ".a"アーカイブ(共有ライブラリに焼いたもの)から別のライブラリへの参照は壊れてしまいます。つまり、チェーン内に静的ライブラリがある場合は、「依存関係チェイン」が壊れます。ここでいくつかの議論.. https://stackoverflow.com/questions/7841920/how-do-static-libraries-do-linking-to-dependencies .. ffmpegのconfigureスクリプトのヒント依存関係? –
静的ライブラリとしてのffmpegは、アーカイブファイルに明示的に存在しない他のライブラリに多くの依存関係があります。外部参照を持つ静的ライブラリの場合です。あなたが壊れた依存関係を意味するのでしょうか?とにかく、共有ライブラリをそれらの依存関係と手動でリンクする必要があります(またはautomake/cmake /あなたのためにできるようなビルドシステムを使用してください)。 libavdeviceを削除してもそれらの依存関係はすべて削除されませんが、少なくともいくつかは削除されます(少なくともjack、oss、pulseaudio)。あなたはほとんどのライブラリを使わなくてもffmpegを作ることができますが、かなり小さいビルドになるでしょう –
私の共有ライブラリを作るときには、 "-L"と "-l" 、vdpau-thingiesなど?オクラシ! –