为 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 链接时出错的主要内容,如果未能解决你的问题,请参考以下文章

ARM-linux 移植 SDL

如何在 ARM 交叉编译时选择要链接的静态库?

我的数码相框.c文件用arm-linux-gcc交叉编译时出现错误,如tgzip.c:309:undefined reference to

编译裸机程序以及交叉工具链

arm交叉编译工具链下载

luvcview-0.2.4移植