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

我正在尝试为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 

说实话,这个编译器不是由我编译的,所以上面的path是无效的。

而一些像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)和其他相应的环境variables,比如$ 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链接,我认为)的符号, 所以这不是解决scheme,因为我不知道哪些库那些符号属于。

所以问题是:

我正在做一些根本上错误的dynamic链接?

为什么-L选项不能帮助gcc链接该目录中的库?

我可以强制编译我的程序没有这个库(嗯,我需要他们在设备上运行程序),并在运行时加载?

-L只是添加一个库搜索目录。 试着指定-lSDL-1.2或者-lSDL来实际地链接一个库。