C GTK3程序交叉编译为ARM(Raspberry Pi)未定义符号错误

C GTK3程序交叉编译为ARM(Raspberry Pi)未定义符号错误,c,linux,raspberry-pi,cross-compiling,gtk3,C,Linux,Raspberry Pi,Cross Compiling,Gtk3,我用crosstool ng为我的raspbian做了一个交叉编译器。它成功地编译了hello word测试程序,但当我编译我的gtk测试程序(使用raspberry pi中的gtk库)时,它编译正常,但当我尝试在raspberry中运行它时,我得到以下结果: pi@raspberrypi ~ $ ./gtk_test gtk_test: symbol lookup error: gtk_test: undefined symbol: gtk_progress_get_type 我的ldd输出

我用crosstool ng为我的raspbian做了一个交叉编译器。它成功地编译了hello word测试程序,但当我编译我的gtk测试程序(使用raspberry pi中的gtk库)时,它编译正常,但当我尝试在raspberry中运行它时,我得到以下结果:

pi@raspberrypi ~ $ ./gtk_test
gtk_test: symbol lookup error: gtk_test: undefined symbol: gtk_progress_get_type
我的ldd输出似乎很好:

pi@raspberrypi ~ $ ldd ./gtk_test
    /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0xb6f33000)
    libgtk-3.so.0 => /usr/lib/arm-linux-gnueabihf/libgtk-3.so.0 (0xb6ac0000)
    libgdk-3.so.0 => /usr/lib/arm-linux-gnueabihf/libgdk-3.so.0 (0xb6a29000)
    libatk-1.0.so.0 => /usr/lib/arm-linux-gnueabihf/libatk-1.0.so.0 (0xb6a04000)
    libgio-2.0.so.0 => /usr/lib/arm-linux-gnueabihf/libgio-2.0.so.0 (0xb68c9000)
    libpangocairo-1.0.so.0 => /usr/lib/arm-linux-gnueabihf/libpangocairo-1.0.so.0 (0xb68b7000)
    libgdk_pixbuf-2.0.so.0 => /usr/lib/arm-linux-gnueabihf/libgdk_pixbuf-2.0.so.0 (0xb6892000)
    libcairo-gobject.so.2 => /usr/lib/arm-linux-gnueabihf/libcairo-gobject.so.2 (0xb6884000)
    libpango-1.0.so.0 => /usr/lib/arm-linux-gnueabihf/libpango-1.0.so.0 (0xb6842000)
    libcairo.so.2 => /usr/lib/arm-linux-gnueabihf/libcairo.so.2 (0xb6756000)
    libgobject-2.0.so.0 => /usr/lib/arm-linux-gnueabihf/libgobject-2.0.so.0 (0xb6706000)
    libglib-2.0.so.0 => /lib/arm-linux-gnueabihf/libglib-2.0.so.0 (0xb6613000)
    libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0xb65ee000)
    libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb65ce000)
    libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6495000)
    libgmodule-2.0.so.0 => /usr/lib/arm-linux-gnueabihf/libgmodule-2.0.so.0 (0xb6488000)
    libX11.so.6 => /usr/lib/arm-linux-gnueabihf/libX11.so.6 (0xb6372000)
    libXi.so.6 => /usr/lib/arm-linux-gnueabihf/libXi.so.6 (0xb635d000)
    libXcomposite.so.1 => /usr/lib/arm-linux-gnueabihf/libXcomposite.so.1 (0xb6352000)
    libXdamage.so.1 => /usr/lib/arm-linux-gnueabihf/libXdamage.so.1 (0xb6347000)
    libXfixes.so.3 => /usr/lib/arm-linux-gnueabihf/libXfixes.so.3 (0xb6339000)
    libatk-bridge-2.0.so.0 => /usr/lib/arm-linux-gnueabihf/libatk-bridge-2.0.so.0 (0xb630f000)
    libpangoft2-1.0.so.0 => /usr/lib/arm-linux-gnueabihf/libpangoft2-1.0.so.0 (0xb62f6000)
    libfontconfig.so.1 => /usr/lib/arm-linux-gnueabihf/libfontconfig.so.1 (0xb62bd000)
    libfreetype.so.6 => /usr/lib/arm-linux-gnueabihf/libfreetype.so.6 (0xb6236000)
    libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb61c2000)
    /lib/ld-linux-armhf.so.3 (0xb6f41000)
    libXinerama.so.1 => /usr/lib/arm-linux-gnueabihf/libXinerama.so.1 (0xb61b7000)
    libXrandr.so.2 => /usr/lib/arm-linux-gnueabihf/libXrandr.so.2 (0xb61a7000)
    libXcursor.so.1 => /usr/lib/arm-linux-gnueabihf/libXcursor.so.1 (0xb6196000)
    libwayland-client.so.0 => /usr/lib/arm-linux-gnueabihf/libwayland-client.so.0 (0xb6185000)
    libxkbcommon.so.0 => /usr/lib/arm-linux-gnueabihf/libxkbcommon.so.0 (0xb6148000)
    libwayland-cursor.so.0 => /usr/lib/arm-linux-gnueabihf/libwayland-cursor.so.0 (0xb6139000)
    libXext.so.6 => /usr/lib/arm-linux-gnueabihf/libXext.so.6 (0xb6122000)
    librt.so.1 => /lib/arm-linux-gnueabihf/librt.so.1 (0xb6113000)
    libz.so.1 => /lib/arm-linux-gnueabihf/libz.so.1 (0xb60f5000)
    libselinux.so.1 => /lib/arm-linux-gnueabihf/libselinux.so.1 (0xb60cf000)
    libresolv.so.2 => /lib/arm-linux-gnueabihf/libresolv.so.2 (0xb60b2000)
    libgthread-2.0.so.0 => /usr/lib/arm-linux-gnueabihf/libgthread-2.0.so.0 (0xb60a8000)
    libpng12.so.0 => /lib/arm-linux-gnueabihf/libpng12.so.0 (0xb6080000)
    libthai.so.0 => /usr/lib/arm-linux-gnueabihf/libthai.so.0 (0xb6070000)
    libpixman-1.so.0 => /usr/lib/arm-linux-gnueabihf/libpixman-1.so.0 (0xb5fd8000)
    libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0xb5fcd000)
    libxcb-shm.so.0 => /usr/lib/arm-linux-gnueabihf/libxcb-shm.so.0 (0xb5fc3000)
    libxcb-render.so.0 => /usr/lib/arm-linux-gnueabihf/libxcb-render.so.0 (0xb5fb5000)
    libxcb.so.1 => /usr/lib/arm-linux-gnueabihf/libxcb.so.1 (0xb5f97000)
    libXrender.so.1 => /usr/lib/arm-linux-gnueabihf/libXrender.so.1 (0xb5f85000)
    libGL.so.1 => /usr/lib/arm-linux-gnueabihf/libGL.so.1 (0xb5f1f000)
    libffi.so.6 => /usr/lib/arm-linux-gnueabihf/libffi.so.6 (0xb5f10000)
    libpcre.so.3 => /lib/arm-linux-gnueabihf/libpcre.so.3 (0xb5eb5000)
    libatspi.so.0 => /usr/lib/arm-linux-gnueabihf/libatspi.so.0 (0xb5e91000)
    libdbus-1.so.3 => /lib/arm-linux-gnueabihf/libdbus-1.so.3 (0xb5e4f000)
    libharfbuzz.so.0 => /usr/lib/arm-linux-gnueabihf/libharfbuzz.so.0 (0xb5dfb000)
    libexpat.so.1 => /lib/arm-linux-gnueabihf/libexpat.so.1 (0xb5dd1000)
    libdatrie.so.1 => /usr/lib/arm-linux-gnueabihf/libdatrie.so.1 (0xb5dc5000)
    libXau.so.6 => /usr/lib/arm-linux-gnueabihf/libXau.so.6 (0xb5db9000)
    libXdmcp.so.6 => /usr/lib/arm-linux-gnueabihf/libXdmcp.so.6 (0xb5dad000)
    libglapi.so.0 => /usr/lib/arm-linux-gnueabihf/libglapi.so.0 (0xb5d76000)
    libX11-xcb.so.1 => /usr/lib/arm-linux-gnueabihf/libX11-xcb.so.1 (0xb5d6d000)
    libxcb-glx.so.0 => /usr/lib/arm-linux-gnueabihf/libxcb-glx.so.0 (0xb5d56000)
    libxcb-dri2.so.0 => /usr/lib/arm-linux-gnueabihf/libxcb-dri2.so.0 (0xb5d4a000)
    libxcb-dri3.so.0 => /usr/lib/arm-linux-gnueabihf/libxcb-dri3.so.0 (0xb5d40000)
    libxcb-present.so.0 => /usr/lib/arm-linux-gnueabihf/libxcb-present.so.0 (0xb5d36000)
    libxcb-sync.so.1 => /usr/lib/arm-linux-gnueabihf/libxcb-sync.so.1 (0xb5d2a000)
    libxshmfence.so.1 => /usr/lib/arm-linux-gnueabihf/libxshmfence.so.1 (0xb5d21000)
    libXxf86vm.so.1 => /usr/lib/arm-linux-gnueabihf/libXxf86vm.so.1 (0xb5d13000)
    libdrm.so.2 => /usr/lib/arm-linux-gnueabihf/libdrm.so.2 (0xb5d01000)
    libgraphite2.so.3 => /usr/lib/arm-linux-gnueabihf/libgraphite2.so.3 (0xb5ce3000)
当我用树莓编译时,我的测试程序运行良好

我的生成文件:

INCLUDE:=-Irpi_sysroot/usr/include/cairo
INCLUDE+=-Irpi_sysroot/usr/include/atk-1.0
INCLUDE+=-Irpi_sysroot/usr/include/gtk-3.0
INCLUDE+=-Irpi_sysroot/usr/include/glib-2.0
INCLUDE+=-Irpi_sysroot/usr/include/pango-1.0
INCLUDE+=-Irpi_sysroot/usr/include/gdk-pixbuf-2.0
INCLUDE+=-Irpi_sysroot/usr/lib/arm-linux-gnueabihf/glib-2.0/include

INCLUDE+=-Irpi_sysroot/usr/include/at-spi2-atk/2.0
INCLUDE+=-Irpi_sysroot/usr/include/gio-unix-2.0/
INCLUDE+=-Irpi_sysroot/usr/include/harfbuzz
INCLUDE+=-Irpi_sysroot/usr/include/freetype2
INCLUDE+=-Irpi_sysroot/usr/include/pixman-1
INCLUDE+=-Irpi_sysroot/usr/include/libpng12


LIBS:=-Lrpi_sysroot/usr/lib/arm-linux-gnueabihf
LIBS+=-Xlinker -rpath-link=rpi_sysroot/lib/arm-linux-gnueabihf
LIBS+=-Xlinker -rpath-link=rpi_sysroot/usr/lib/arm-linux-gnueabihf
LIBS+=-lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0
LIBS+=-lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0

CC:=./gcc_glibc_2.18/bin/armv6-rpi-linux-gnueabi-gcc


all:
    $(CC) $(INCLUDE) -Wall gtk_test.c -o gtk_test $(LIBS)

有人能解释一下吗?谢谢

最后我发现了问题所在:

使用-v-Wl,-verbose编译并查看输出结果表明,rpi_sysroot/usr/lib/arm linux gnueabihf/libc.so(一个脚本)试图与错误的库链接。要修复此问题,请打开libc.so并从此处更改:

   /* GNU ld script
      Use the shared library, but some functions are only in
      the static library, so try that secondarily.  */
   OUTPUT_FORMAT(elf32-littlearm)
   GROUP ( /lib/arm-linux-gnueabihf/libc.so.6 /usr/lib/arm-linux-gnueabihf/libc_nonshared.a
   AS_NEEDED ( /lib/arm-linux-gnueabihf/ld-linux-armhf.so.3 ) )
为此:

 /* GNU ld script
      Use the shared library, but some functions are only in
      the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf32-littlearm)
GROUP ( ../../../lib/arm-linux-gnueabihf/libc.so.6 ../../../usr/lib/arm-linux-gnueabihf/libc_nonshared.a  AS_NEEDED ( ../../../lib/arm-linux-gnueabihf/ld-linux-armhf.so.3 ) )
所以它指向了正确的树莓库

编辑:
一个更简单的解决方案是删除rpi_sysroot/usr/lib/arm-linux-gnueabihf/libc.so和rpi_-sysroot/usr/lib/arm-linux-gnueabihf/libc.a,使链接器返回到libc的交叉编译器版本。那么

您使用了什么版本的gtk进行交叉编译。RPi上的本机版本是什么?还有,
gtk\u progress\u get\u type
应该是什么?这应该是
GtkProgressBar
?文档没有为
gtk_progress
GtkProgress
生成任何内容。我使用了gtk-3.0(我从树莓中获取)。是的,gtk_progress_get_type我认为与GtkProgressBar有关。没有人(gcc或ld)抱怨编译=(@drahnr谢谢你的帮助=D