在为ARM交叉编译应用程序时与sdl链接时出错

时间:2011-02-20 21:01:25

标签: c++ c linux sdl cross-compiling

我正在尝试为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等都设置了对应的crosscompile工具链位置)

$ 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链接该目录中的库?

我是否可以在没有这些库的情况下强制编译我的程序(好吧,我还需要它们在设备上运行程序)并在运行时加载它?

1 个答案:

答案 0 :(得分:1)

-L只是添加了一个库搜索目录。另请尝试指定-lSDL-1.2-lSDL以实际链接到库。