gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:09:27 30 4
gpt4 key购买 nike

我正在尝试为 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 链接该目录中的库?

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

最佳答案

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

关于c++ - 为 ARM 交叉编译应用程序时与 sdl 链接时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5059973/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com