Почему возникает ошибка при кросс-компиляции Arm Linux GCC?

Я пытаюсь использовать AppWeb, и я написал очень простую программу для встраивания AppWeb в свое приложение, она использует функцию в библиотеке AppWeb.

#include <appweb/appweb.h>
int main(int argc, char** argv)
{
    return maRunWebServer("appweb.conf");
}

Я не знаю, когда я компилирую с помощью gcc (или cc), он компилируется успешно. Но когда я выполняю перекрестную компиляцию в архитектуру Arm, возникает ошибка. Это мой Makefile:

CC = gcc

LIBS = lib

FLAG = -lappweb -lmpr

TEST_TARGET = embed-appweb
OBJS = embed-appweb

all: clean compile

compile: run
    $(CC) -Wall -L$(LIBS) $(FLAG) -o $(TEST_TARGET) $(OBJS).o

run:
    $(CC) -Wall -L$(LIBS) $(FLAG) -c $(OBJS).c

clean:
    @rm -rf $(TEST_TARGET) $(TEST_TARGET).trc *.o *~
    @echo "Clean complete"

Я заменил «CC = gcc» на «CC = arm-linux-gcc» для кросс-компиляции. Ошибка в моей задаче:

arm-linux-gcc -Wall -Llib -lappweb -lmpr -c embed-appweb.c
embed-appweb.c:1:27: error: appweb/appweb.h: No such file or directory
embed-appweb.c: In function 'main':
embed-appweb.c:4: warning: implicit declaration of function 'maRunWebServer'
make: *** [run] Error 1

и я уверен, что библиотека "libappweb.so" существовала в моей папке "lib"

Кто-нибудь может сказать мне, почему он получил ошибку? и дать мне совет?

Спасибо,


person TidusLe    schedule 16.01.2012    source источник
comment
Какие ошибки вы получаете? Вы уверены, что необходимые библиотеки кросс-компилированы и установлены в нужных местах?   -  person Basile Starynkevitch    schedule 16.01.2012
comment
Рассматриваемая ошибка: ошибка не указана.   -  person leppie    schedule 16.01.2012
comment
ах, я сожалею об этом :D Я добавил свою ошибку в свой пост ^^   -  person TidusLe    schedule 16.01.2012


Ответы (3)


Знаете ли вы, как использовать параметр -I gcc?

Ошибка, которую вы получаете, связана с тем, что компилятор (gcc) может найти файлы, которые вы хотели включить.

Самым простым решением было бы изменить FLAG в вашем Makefile:

FLAG = -lappweb -lmpr

to

FLAG = -lappweb -lmpr -I/path/to/my/headers

Конечно, вы должны изменить /path/to/my/headers на истинный путь, по которому находятся ваши заголовки.

person sessyargc.jp    schedule 16.01.2012

Вы должны установить (или символически связать) заголовок appweb с деревом включения arm-linux-gcc.

Например, команда arm-linux-gcc для одной из моих систем

$ which arm-linux-gcc
/home/eldk/usr/bin/arm-linux-gcc

Итак, включаемые файлы, которые использует компилятор:

 $ arm-linux-gcc -print-search-dirs
install: /home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/
programs: =/home/eldk/usr/bin/../libexec/gcc/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/bin/../libexec/gcc/:/home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/lib/gcc/arm-linux-gnueabi/:/usr/libexec/gcc/arm-linux-gnueabi/4.2.2/:/usr/libexec/gcc/arm-linux-gnueabi/:/home/eldk/usr/libexec/gcc/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/bin/../lib/gcc/arm-linux-gnueabi/4.2.2/../../../../arm-linux-gnueabi/bin/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/bin/../lib/gcc/arm-linux-gnueabi/4.2.2/../../../../arm-linux-gnueabi/bin/:/home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/../../../../arm-linux-gnueabi/bin/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/../../../../arm-linux-gnueabi/bin/
libraries: =/home/eldk/usr/bin/../lib/gcc/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/bin/../lib/gcc/:/home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/:/usr/libexec/gcc/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/bin/../lib/gcc/arm-linux-gnueabi/4.2.2/../../../../arm-linux-gnueabi/lib/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/bin/../lib/gcc/arm-linux-gnueabi/4.2.2/../../../../arm-linux-gnueabi/lib/:/home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/../../../../arm-linux-gnueabi/lib/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/../../../../arm-linux-gnueabi/lib/:/home/eldk/usr/../arm/lib/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/../arm/lib/:/home/eldk/usr/../arm/usr/lib/arm-linux-gnueabi/4.2.2/:/home/eldk/usr/../arm/usr/lib/
person wallyk    schedule 16.01.2012
comment
Вы имеете в виду, что я должен скопировать заголовок appweb в дерево включения arm-linux-gcc? Мой arm-linux-gcc: # which arm-linux-gcc /media/Learning/Embedded-Systems/Soft/gcc-4.3.2/local/arm/4.3.2/bin/arm-linux-gcc или как связать заголовок appweb с arm-linux-gcc? - person TidusLe; 16.01.2012

У вас есть две проблемы:

  1. Ваш путь поиска включает (как уже указано sessyargc.jp и wallyk).
  2. Ваш путь поиска библиотеки.

Когда вы компилируете с помощью gcc, он будет использовать ваши конфигурации gcc для поиска заголовков и библиотек внутри своей собственной цепочки инструментов. По умолчанию это что-то вроде «/usr/include» и «/usr/lib».

Когда вы компилируете с помощью arm-linux-gcc, как это делал ранее gcc, он будет использовать ваши конфигурации arm-linux-gcc для поиска заголовков и библиотек внутри своей собственной цепочки инструментов. Это может быть где угодно, в зависимости от вашей цепочки инструментов (например, "/home/eldk/usr/lib/gcc/arm-linux-gnueabi/4.2.2/..." для Wallyk).

Обратите внимание, что у вас есть две разные цепочки инструментов, и каждая из них имеет свои собственные файлы.

Вы не можете связать библиотеку, созданную для «x86», с двоичным файлом ARM. Они несовместимы!

gcc ссылки на библиотеки gcc, arm-linux-gcc ссылки на библиотеки arm-linux-gcc.

Даже заголовки, которые представляют собой обычный текст, не могут быть одинаковыми, так как разные процессоры могут иметь разные конфигурации для последовательностей байтов, размеров данных и т. д.

ТАК

Вы должны установить AppWeb, кросс-компилированный для ARM, прежде чем приступать к компиляции примера приложения.

После этого вы получите appweb/appweb.h и -lappweb, доступные для вашей цепочки инструментов.

Сообщите нам, если вам нужна помощь в кросс-компиляции AppWeb. В источниках должен быть README, рассказывающий, как это сделать.

person j4x    schedule 02.02.2012