ショートバージョン
libgio-2.0.so.0.4800.1 (libgio-2.0.so) と libz.so.1.2.8 (libz.so) を含むいくつかのライブラリに対して実行可能ファイルをリンクすると、2 つの未解決のシンボル - deflateSetHeader@ZLIB_1.2.2 とinflateGetHeader@ZLIB_1.2.2. どちらのシンボルも libz.so で定義されていませんが、inflateGetHeader@@ZLIB_1.2.2 と deflateSetHeader@@ZLIB_1.2.2 は次のとおりです。
readelf -s libz.so|grep Header
63: 00007991 28 FUNC GLOBAL DEFAULT 12 inflateGetHeader@@ZLIB_1.2.2
98: 00003319 24 FUNC GLOBAL DEFAULT 12 deflateSetHeader@@ZLIB_1.2.2
367: 00003319 24 FUNC GLOBAL DEFAULT 12 deflateSetHeader
386: 00007991 28 FUNC GLOBAL DEFAULT 12 inflateGetHeader
libgio で参照されるその他のシンボルは、libz によって正常に解決されますが、これら 2 つでは解決されません。
ロングバージョン
Linaro 4.4 カーネルで 32 ビット Ubuntu 14.04 を実行する Zynq 7010 ベースのターゲット ( krtkl.com )用に、Windows ホスト (Xilinx SDK 2016.1 (Eclipse)、ツールチェーン "arm-linux-gnueabihf") からクロス コンパイルしています。 .
ホスト プラットフォームとターゲット プラットフォームの両方が示されています。
外部共有ライブラリを使用する手順は次のとおりです。ターゲット上でライブラリをダウンロード、構成、およびビルドし (ライブラリがターゲット上に既に存在する場合を除く)、インクルード ファイルとライブラリ (libabc.so.xyz) ファイルを別のプロジェクト ディレクトリにコピーします。 libabc.so.xyz の名前を abc.so に変更し、ライブラリ パスをプロジェクト ディレクトリに、ライブラリ名を abc に設定します (つまり、gcc ... -L<project dir> -labc)。
この手順を使用して、GLib (とりわけ) をプロジェクトに含めています。GLib (libglib.so) には GIO (libgio.so) が必要であり、GIO (libgio.so) には (とりわけ) ZLIB (libz.so) が必要です。
これらのライブラリはソースから構築されています: glib-2.48.1 (gio、gobject、および gmodule を含む)、libffi-3.2.1、zlib-1.2.8。その他は Ubuntu ディストリビューションのものです。
Windowsでクロスコンパイラを実行すると(Eclipseでは「Project | Build All」)、すべてが計画どおりに進みます-libgio-2.0.so、libglib-2.0.so、gobject-2.0.so、libffi.so、libgmodule- 2.0.so、libdl.so、libpcre.so、libresolv-2.19.so、および libz.so は、deflateSetHeader@ZLIB_1.2.2 および inflateGetHeader@ZLIB_1.2.2 を除くすべての外部参照を満たします。
readelf の出力 (上記を参照) は、libz.so で使用できる類似したシンボルを示していますが、同一ではありません。オンラインで検索しているときに同様の問題についていくつか言及されているのを見たことがありますが、解決策は常に ZLIB の古いバージョンを見つけることに関係しています - 私の開発環境では可能性はありません。
libgio と libz はどちらも広く使用されている確立されたライブラリです。これはバグではありませんよね?
私はアイデアがありません - 誰かがこれまたは似たようなことに遭遇しましたか?
[アップデート]
gcc バージョン 4.9.2 20140904 (プレリリース) (crosstool-NG linaro-1.13.1-4.9-2014.09 - Linaro GCC 4.9-2014.09)
リクエストに応じて、Eclipse によって出力されるコンパイラおよびリンカー コマンドの例を以下に示します。
19:53:13 **** Auto Build of configuration Debug for project Project_2 ****
make -j8 all
'Building file: ../src/Project.c'
'Invoking: ARM v7 Linux gcc compiler'
arm-linux-gnueabihf-gcc -DCONFIGURATION_DEBUG -Wall -O0 -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard -g3 -I"C:\Users\Nick\XSDK\Workspace\snickerdoodle_bsp\ps7_cortexa9_0\include" -I"C:\Users\Nick\XSDK\Workspace\Project_2\src" -I"C:\Users\Nick\XSDK\Workspace\Project_2\src\Dir1" -I"C:\Users\Nick\XSDK\Workspace\Project_2\src\Dir2" -I"C:\Users\Nick\XSDK\Workspace\Project_2\src\Dir3" -I"C:\Users\Nick\XSDK\Workspace\Project_2\src\Dir4" -I"C:\Users\Nick\XSDK\Workspace\Project_2\src\Dir5" -I"C:\Users\Nick\XSDK\Workspace\Project_2\src\Dir6" -I"C:\Users\Nick\XSDK\Workspace\Project_2\src\Dir7" -I"C:\Users\Nick\XSDK\Workspace\Project_2\src\Dir8" -I"C:\Users\Nick\XSDK\Workspace\LibXml2\include" -I"C:\Users\Nick\XSDK\Workspace\LibXml2\include\libxml" -I"C:\Users\Nick\XSDK\Workspace\GLibC\include" -c -fmessage-length=0 -MT"src/Project.o" -MMD -MP -MF"src/Project.d" -MT"src/Project.o" -o "src/Project.o" "../src/Project.c"
'Finished building: ../src/Project.c'
'Invoking: ARM v7 Linux gcc linker'
arm-linux-gnueabihf-gcc -L"C:\Users\Nick\XSDK\Workspace\LibXml2\lib" -L"C:\Users\Nick\XSDK\Workspace\GLibC\lib" -o "Project_2.elf" <all the .o files> -lpthread -lm -lxml2 -llzma -lgio-2.0 -lglib-2.0 -lgobject-2.0 -lffi -lgmodule-2.0 -ldl -lpcre -lresolv-2.19 -lz
c:/xilinx/sdk/2016.1/gnu/aarch32/nt/gcc-arm-linux-gnueabi/bin/../lib/gcc/arm-linux-gnueabihf/4.9.2/../../../../arm-linux-gnueabihf/bin/ld.exe: warning: libz.so.1, needed by C:\Users\Nick\XSDK\Workspace\GLibC\lib/libgio-2.0.so, not found (try using -rpath or -rpath-link)
C:\Users\Nick\XSDK\Workspace\GLibC\lib/libgio-2.0.so: undefined reference to `deflateSetHeader@ZLIB_1.2.2'
C:\Users\Nick\XSDK\Workspace\GLibC\lib/libgio-2.0.so: undefined reference to `inflateGetHeader@ZLIB_1.2.2'