为 ARM 交叉编译应用程序时与 sdl 链接时出错
Posted
技术标签:
【中文标题】为 ARM 交叉编译应用程序时与 sdl 链接时出错【英文标题】:error linking with sdl while crosscompiling application for ARM 【发布时间】:2011-02-20 21:01:25 【问题描述】:我正在尝试为 ARM 处理器交叉编译简单的 SDL 应用程序。
我正在使用 带有 Intel Xscale PX27x rev 7(带 iwmmxt 扩展)处理器的摩托罗拉 A1200 并修改了交叉编译工具链,例如 gcc:
arm-linux-gnu-g++ --version
arm-linux-gnu-g++ (GCC) 3.3.6
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ arm-linux-gnu-g++ -v
Reading specs from /opt/crosstool/bin/../lib/gcc-lib/arm-linux-gnu/3.3.6/specs
Configured with: /home/nuso2f/mkezx-0.9.20/build/host/crosstool-ezx/configure --host=i486-host_linux-gnu --target=arm-linux-gnu --prefix=/home/nuso2f/mkezx-0.9.20/build/host/crosstool-ezx.fake_root --with-cpu=iwmmxt --enable-cxx-flags=-mcpu=iwmmxt --with-float=soft --with-headers=/home/nuso2f/mkezx-0.9.20/build/host/crosstool-ezx.fake_root/arm-linux-gnu/include --with-local-prefix=/home/nuso2f/mkezx-0.9.20/build/host/crosstool-ezx.fake_root/arm-linux-gnu --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++,f77 --enable-shared --enable-c99 --enable-long-long
Thread model: posix
gcc version 3.3.6
说实话,这个编译器不是我编译的,所以上面的路径是无效的。
还有一些包含 libSDL libSDL_mixer 等库的目录 我已经检查了所有这些库是否适用于 ARM。
$ file *.so*
ELF 32-biarm-linux-gnu-g++ ttt.cpp -o ttt.arm -I/usr/include -L`pwd`
原来如此。
然后我将 libSDL-1.2.so 复制到项目目录中。来自该库的检查符号
readelf --syms libSDL-1.2.so
一切都好。
然后尝试编译: (注意arm-linux-gnu-g++($CXX)等对应的环境变量,如$LD、$AR等都是设置对应交叉编译工具链位置的)
$ arm-linux-gnu-g++ ttt.cpp -o ttt.arm -I/usr/include -L`pwd`
/tmp/ccXpDX0V.o(.text+0xb0): In function `main':
: undefined reference to `SDL_Init'
/tmp/ccXpDX0V.o(.text+0xd8): In function `main':
: undefined reference to `SDL_SetVideoMode'
/tmp/ccXpDX0V.o(.text+0x170): In function `main':
: undefined reference to `SDL_UpperBlit'
/tmp/ccXpDX0V.o(.text+0x17c): In function `main':
: undefined reference to `SDL_Flip'
/tmp/ccXpDX0V.o(.text+0x1c8): In function `main':
: undefined reference to `SDL_PollEvent'
/tmp/ccXpDX0V.o(.text+0x2d8): In function `$a':
: undefined reference to `SDL_FillRect'
/tmp/ccXpDX0V.o(.text+0x334): In function `myabort(char const*)':
: undefined reference to `SDL_GetError'
/tmp/ccXpDX0V.o(.text+0x380): In function `my_img_load(char*)':
: undefined reference to `SDL_RWFromFile'
/tmp/ccXpDX0V.o(.text+0x390): In function `my_img_load(char*)':
: undefined reference to `SDL_LoadBMP_RW'
/tmp/ccXpDX0V.o(.text+0x3b8): In function `my_img_load(char*)':
: undefined reference to `SDL_DisplayFormatAlpha'
/tmp/ccXpDX0V.o(.text+0x3c8): In function `my_img_load(char*)':
: undefined reference to `SDL_FreeSurface'
collect2: ld returned 1 exit statust LSB shared object, ARM, version 1, dynamically linked, stripped
虽然当我试图像这样编译时
arm-linux-gnu-g++ ttt.cpp -o ttt.arm -I/usr/include ./libSDL-1.2.so
它确实针对 SDL 进行编译和链接(我希望如此),但是存在 另一个 链接错误,但带有来自 qt 库的符号(我认为是与 SDL 链接的),所以它不是解决方案,因为我不知道这些符号属于哪个库。
所以问题是:
我在动态链接方面做错了什么吗?
为什么 -L 选项不能帮助 gcc 链接到该目录中的库?
我可以在没有这个库的情况下强制编译我的程序(好吧,无论如何我都需要它们在设备上运行程序)并在运行时加载它?
【问题讨论】:
请注意 -I/usr/include 将使用来自您主机的标头,这些标头可能与您的交叉编译工具链提供的标头不同。 【参考方案1】:-L
只是添加了一个库搜索目录。尝试同时指定 -lSDL-1.2
或 -lSDL
以实际链接到库。
【讨论】:
我还发现了-Wl,--noinhibit-exec
链接器选项,即使找不到需要的符号也会导致强制链接以上是关于为 ARM 交叉编译应用程序时与 sdl 链接时出错的主要内容,如果未能解决你的问题,请参考以下文章
我的数码相框.c文件用arm-linux-gcc交叉编译时出现错误,如tgzip.c:309:undefined reference to