Ниже на достаточно лёгком примере я попытаюсь собрать несложную сетевую утилиту, а Вы, коллеги, покажете, где в моих расуждениях засада.
Итак, преамбула.
Нативная компиляция, на мой взгляд, самый простой способ сборки ПО для роутера. Простота нативной компиляции состоит в том, что софт компилируется в самой благоприятной среде: общие библиотеки находятся в /opt/lib, заголовочные файлы в /opt/include, и пр. Кроме того, оценить получившийся результат можно сразу после компиляции. Но на ряду с простотой, нативный способ имеет следующие недостатки:
- долгое время компиляции софта,
- потенциальная нехватка памяти для работы компилятора,
- устаревший тулчейн (главный недостаток!),
- возможные проблемы с libtool, установленной в системе.
Перечислю инструменты, предлагаемые для кросс-компиляции:
- Старый тулчейн Олега. gcc 4.1.1(?) + uClibc 0.9.19. В качестве инструмента не рассматриваю, он устарел.
- Тулчейн Optware. gcc 4.1.1 + uClibc 0.9.28. Кстати, именно эта связка инструментов используется при нативной компиляции. После установки этот тулчейн отпугнул меня своей кучей скриптов на все случаи жизни. Чтобы начать с ним работать, необходимо разобраться с шаблоном скрипта template.mk и действовать аналогично. Честно говоря, я не хочу разбираться с этой кучей скриптов, и, тем более, искать причину если что-то пойдёт не так.
- Тулчейн энтузиастов, gcc 4.3.5 + uClibc 0.9.30.1. Этим тулчейном собирается сама прошивка. Собранный с помощью него софт пойдёт только на нашей коробочке и не запустится на других optware-based роутерах. На сайте прошивки есть два архива - hndtools-mipsel-uclibc-4.3.5-2.tar.bz2 и появившийся несколько дней назад hndtools-mipsel-uclibc-4.3.5-x86_64-3.tar.bz2. Бинарники из второго в последней Ubuntu у меня выполняться отказались и я выбрал в качестве инструмента первый архив. Этот инструмент мне понравился больше всего: в нём содержатся исключительно исключительно инструменты для компиляции. Никаких скриптов, как в варианте optware нет, поэтому различные зависимости для компилировния софта придётся прописывать самому, что лучше всего подходит для понимания процесса.
Теперь тестовый пример.
Маленькая сетевая утилита Ping Tunnel, имеющая одну зависимость. Как нельзя лучше подходит для примера.
Нативная компиляция.
Устанавливаем зависимости:
Code:
$ ipkg install libpcap libpcap-dev
Скачиваем, распаковываем исходники и компилируем:
Code:
$ wget http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.71.tar.gz
$ tar -xvzf ./PingTunnel-0.71.tar.gz
$ cd PingTunnel/
$ make
Готово!
Кросс-компиляция тулчейном энтузиастов.
- Устанавливаю тулчейн в ~/newtoolchain,
- В ~/newtoolchain/opt/lib и в ~/newtoolchain/opt/include кладу распакованные из ipk-пакетов файлы зависимой библиотеки libpcap.
- Правлю Makefile софтины, указывая перечисленные выше директории для компилятора и линковщика соответственно. Меняю компилятор с gcc на mipsel-linux-uclibc-gcc.
Code:
# Makefile for the pingtunnel utility
# (c) 2004-2009 Daniel Stoedle, daniels@cs.uit.no
# ptunnel.exe target added by Mike Miller, mike@mikeage.net
CC = mipsel-linux-uclibc-gcc
CFLAGS = -Wall -g -I/home/al/newtoolchain/opt/include -I/home/al/newtoolchain/lib/gcc/mipsel-linux-uclibc/4.3.5/include
LDOPTS = -lpthread -L/home/al/newtoolchain/opt/lib -L/home/al/newtoolchain/lib/gcc/mipsel-linux-uclibc/4.3.5 -lpcap
PT_OBJS = ptunnel.o md5.o
...
- 4. Пытаюсь компилировать:
Code:
$ make
mipsel-linux-uclibc-gcc -o ptunnel ptunnel.o md5.o -lpthread -L/home/al/newtoolchain/opt/lib -L/home/al/newtoolchain/lib/gcc/mipsel-linux-uclibc/4.3.5 -lpcap
/home/al/newtoolchain/opt/lib/libpcap.so: undefined reference to `__ctype_b_loc'
collect2: ld returned 1 exit status
make: *** [ptunnel] Ошибка 1
В чём засада?