ошибка связи с sdl при кросс-компиляции приложения для ARM - PullRequest
3 голосов
/ 21 февраля 2011

Я пытаюсь кросс-компилировать простое приложение SDL для процессора ARM.

Я использую Motorola A1200 с процессором Intel Xscale PX27x rev 7 (с расширением iwmmxt) И модифицированный набор инструментов для кросс-компиляции, например, 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 связать библиотеки с этим каталогом?

Можно ли вообще принудительно скомпилировать мою программу без этих библиотек (ну, в любом случае, они мне нужны для запуска программы на устройстве) и загрузить ее во время выполнения?

1 Ответ

1 голос
/ 21 февраля 2011

-L просто добавляет каталог поиска библиотеки.Попробуйте также указать -lSDL-1.2 или -lSDL для фактической ссылки на библиотеку.

...