我正在尝试为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
来实际地链接一个库。