交叉编译-链接libgio.so和libz.so(linux)时未解析的符号



简短版本

将我的可执行文件链接到几个库,包括libgio-2.0.so0.4800.1(libgio-2.0.so(和libz.so.1.2.8(libz.so(,我得到了两个未解析的符号-deflateSetHeader@ZLIB_1.2.2和inflateGetHeader@ZLIB_1.2.2.这两个符号都没有在libz.so中定义,但充气GetHeader@@ZLIB_1.2.2和放气SetHeader@@ZLIBC_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成功解析,但这两个符号没有。

长版本

我正在从Windows主机(Xilinx SDK 2016.1(Eclipse(,工具链"arm-linux-gnueabihf"(为基于Zynq 7010的目标(krtkl.com(进行交叉编译,该目标运行带有Linaro 4.4内核的32位Ubuntu 14.04。

主机和目标平台都有,以防你觉得有必要问我为什么要这样做。

使用外部共享库的过程是:在目标上下载、配置和构建库(除非该库已经存在于目标上(,然后将include和库(libabc.so.x.y.z(文件复制到主机上的自定义项目目录中,将libabc.so.xy.z重命名为abc.so,并将库路径设置为项目目录,将库名称设置为abc(即gcc…-L<项目目录>-labc(。

我正在使用这个过程将GLib(以及其他(包括在我的项目中。GLib(libglib.so(需要GIO(libgio.so(,而GIO又需要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、goject-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中可用的类似但不完全相同的符号。因此,我在网上搜索时看到过一些类似问题的提及,但解决方案总是与找到过时版本的ZLIB有关-考虑到我的开发环境,这是不可能的。

libgio和libz都是广泛使用的成熟库——这不可能是一个bug,对吧?

我没有主意了——有人遇到过这个或类似的事情吗?

[更新]

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:UsersNickXSDKWorkspacesnickerdoodle_bspps7_cortexa9_0include" -I"C:UsersNickXSDKWorkspaceProject_2src" -I"C:UsersNickXSDKWorkspaceProject_2srcDir1" -I"C:UsersNickXSDKWorkspaceProject_2srcDir2" -I"C:UsersNickXSDKWorkspaceProject_2srcDir3" -I"C:UsersNickXSDKWorkspaceProject_2srcDir4" -I"C:UsersNickXSDKWorkspaceProject_2srcDir5" -I"C:UsersNickXSDKWorkspaceProject_2srcDir6" -I"C:UsersNickXSDKWorkspaceProject_2srcDir7" -I"C:UsersNickXSDKWorkspaceProject_2srcDir8" -I"C:UsersNickXSDKWorkspaceLibXml2include" -I"C:UsersNickXSDKWorkspaceLibXml2includelibxml" -I"C:UsersNickXSDKWorkspaceGLibCinclude" -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:UsersNickXSDKWorkspaceLibXml2lib" -L"C:UsersNickXSDKWorkspaceGLibClib" -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:UsersNickXSDKWorkspaceGLibClib/libgio-2.0.so, not found (try using -rpath or -rpath-link)
C:UsersNickXSDKWorkspaceGLibClib/libgio-2.0.so: undefined reference to `deflateSetHeader@ZLIB_1.2.2'
C:UsersNickXSDKWorkspaceGLibClib/libgio-2.0.so: undefined reference to `inflateGetHeader@ZLIB_1.2.2'

原来是一位同事称之为IO错误(针对无能操作员(。在另一个与共享版本竞争的项目中,存在zlib(libz.a(的第二个静态副本。对那个项目进行了一点重新调整,现在一切都编译得很好。

通过从LDFLAGS/LDLIBS中删除-lz,它为我解决了

相关内容

  • 没有找到相关文章

最新更新