Начну с конца:
В чем отличие между #include <> и #include «» ?
Дело в том, что если в коде стоит #include — то в ошибках выдается:
gen-devlist.c:7:19: error: stdio.h — файлнотфаунд, а когда stdio.h стоит в кавычках, он выплевывает кучу других ненайденных заголовков. как быть? и вообще, где ищутся файлы перечисляемые после слова include в одном и другом случае?
А теперь собственно с чего все началось:
Захотелось мне скомпилировать собственную прошивку для D-Link DI-524UP.
Захотелось, потомучто в нем есть USB-порт, который было бы здорово научить понимать не только принтеры, но и другие устройств типа флэшек. Есть сайт на котором один энтузиаст этого дела успешно справился с такой задачей (http://ossfans.org/DI524UP/). Однако у меня сделать это по его методике не выходит, хотя делаю вроде бы все тоже самое что и он. Первый затык у меня появляется, когда я пишу make menuconfig — при этом выдется, что у меня якобы нету библиотек ncurses, хотя на самом деле они есть — ncurses-5 и даже ncurses-5.5 кажется. Ну да ладно, благо обычный make config срабатывает без ошибок. make dep тоже все делает без запинок. А вот окончательный make стопорит на файле /linux-2.4.x/drivers/pci/gen-devlist.c , так как не находит двух заголовков string.h и stdio.h соответственно.
Куда я только эти файлы не пихал! и во все includ-ы и во все lib-ы всеравно — файлнотфаунд. даже впихнул в переменную окружения путь к ним — пофигу, файлнотфунд и все тут!
Помогите чем можете, пожалуйста (второй месяц уже пошел).
P.S.: прошу модераторов, если сочтут нужным перенести мой пост куда следует, если он не соответствует этому разделу — только не удаляйте.
Последние комментарии
- OlegL, 17 декабря 2023 года в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
libncurses5-dev
Было б неплохо увидеть логи, а не сказки-пересказки.
Я дико извиняюсь, но логи смогу показать только послезавтра (я сегодня-завтра на работе, а машина в другом месте). Могу только сказать что другие исходники из вышеприведенной директории собираются нормально и без ошибок, хотя там в начале стоит #include или другие заголовки. В директорию linux я соответственно пробовал скопировать stdio.h переписав соответственно строку c include-ом — не помогает, в директорию уровнем выше тоже копировал stdio.h — тоже не помогает.
Все-таки что означает в исходнике <> или «» после include?
Где в первом и втором случае будут искаться заголовки?
#include <> — системный заголовочный файл.
#include «» — заголовочный файл твоей программы.
Отличия в путях поиска, «» ищется в текущем каталоге, <> в системных.
Это более чем странно (как я понимаю ты компилируешь что-то ядерное), в ядре нельзя использовать стандартную библиотеку, а stdio.h — заголовочный файл стандартной библиотеки.
Смотри выше, также обрати внимание на параметр -I при компиляции.
Совет закоментить эти include в исходнике и посмотреть что получиться. Ошибки сюда :)
Интересно почему.
Разверни :)
Ну вот и обещанные логи (это для исходника с #include ):
make V=1 ARCH=mips CROSS_COMPILE=/opt/cross/mips-patfree-uclibc/bin/mips-linux- -C linux-2.4.x || exit 1
make[1]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x'
. scripts/mkversion > .tmpversion
/opt/cross/mips-patfree-uclibc/bin/mips-linux-gcc -D__KERNEL__ -I/home/maxos/DL/GPL_Di524up/linux-2.4.x/include -DUSB_LED_GPIO_A5 -DDI524UP=1 -DUSER_DEFINE_DAYLIGHT_SAVING=1 -Wall -Wstrict-prototypes -Wno-trigraphs -O1 -gdwarf-2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -I /home/maxos/DL/GPL_Di524up/linux-2.4.x/include/asm/gcc -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -mabi=32 -march=r3000 -mips1 -Wa,-32 -Wa,-march=r3000 -Wa,-mips1 -DUTS_MACHINE=’«mips»' -DKBUILD_BASENAME=version -c -o init/version.o init/version.c
make CFLAGS="-D__KERNEL__ -I/home/maxos/DL/GPL_Di524up/linux-2.4.x/include -DUSB_LED_GPIO_A5 -DDI524UP=1 -DUSER_DEFINE_DAYLIGHT_SAVING=1 -Wall -Wstrict-prototypes -Wno-trigraphs -O1 -gdwarf-2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -I /home/maxos/DL/GPL_Di524up/linux-2.4.x/include/asm/gcc -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -mabi=32 -march=r3000 -mips1 -Wa,-32 -Wa,-march=r3000 -Wa,-mips1 » -C arch/mips/tools
make[2]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/arch/mips/tools'
cmp -s offset.h /home/maxos/DL/GPL_Di524up/linux-2.4.x/include/asm-mips/offset.h || (cp offset.h /home/maxos/DL/GPL_Di524up/linux-2.4.x/include/asm-mips/offset.h.new && mv /home/maxos/DL/GPL_Di524up/linux-2.4.x/include/asm-mips/offset.h.new /home/maxos/DL/GPL_Di524up/linux-2.4.x/include/asm-mips/offset.h)
make[2]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/arch/mips/tools'
make CFLAGS="-D__KERNEL__ -I/home/maxos/DL/GPL_Di524up/linux-2.4.x/include -DUSB_LED_GPIO_A5 -DDI524UP=1 -DUSER_DEFINE_DAYLIGHT_SAVING=1 -Wall -Wstrict-prototypes -Wno-trigraphs -O1 -gdwarf-2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -I /home/maxos/DL/GPL_Di524up/linux-2.4.x/include/asm/gcc -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -mabi=32 -march=r3000 -mips1 -Wa,-32 -Wa,-march=r3000 -Wa,-mips1 » -C kernel
make[2]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/kernel'
make all_targets
make[3]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/kernel'
make[3]: Nothing to be done for `all_targets’.
make[3]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/kernel'
make[2]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/kernel'
make CFLAGS="-D__KERNEL__ -I/home/maxos/DL/GPL_Di524up/linux-2.4.x/include -DUSB_LED_GPIO_A5 -DDI524UP=1 -DUSER_DEFINE_DAYLIGHT_SAVING=1 -Wall -Wstrict-prototypes -Wno-trigraphs -O1 -gdwarf-2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -I /home/maxos/DL/GPL_Di524up/linux-2.4.x/include/asm/gcc -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -mabi=32 -march=r3000 -mips1 -Wa,-32 -Wa,-march=r3000 -Wa,-mips1 » -C drivers
make[2]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers'
make -C block
make[3]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/block'
make all_targets
make[4]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/block'
make[4]: Nothing to be done for `all_targets’.
make[4]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/block'
…
…
…
make -C parport
make[3]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/parport'
make all_targets
make[4]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/parport'
make[4]: Nothing to be done for `all_targets’.
make[4]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/parport'
make[3]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/parport'
make -C pci
make[3]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/pci'
make all_targets
make[4]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/pci'
unset GCC_EXEC_PREFIX; gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -o gen-devlist gen-devlist.c
gen-devlist.c:7:20: error: string.h: No such file or directory
gen-devlist.c:8:19: error: stdio.h: No such file or directory
gen-devlist.c:13: error: expected ')' before '*' token
gen-devlist.c: In function 'main’:
gen-devlist.c:37: error: 'FILE' undeclared (first use in this function)
gen-devlist.c:37: error: (Each undeclared identifier is reported only once
gen-devlist.c:37: error: for each function it appears in.)
gen-devlist.c:37: error: 'devf' undeclared (first use in this function)
gen-devlist.c:37: error: 'clsf' undeclared (first use in this function)
gen-devlist.c:37: warning: left-hand operand of comma expression has no effect
gen-devlist.c:39: warning: implicit declaration of function 'fopen'
gen-devlist.c:42: warning: implicit declaration of function 'fprintf'
gen-devlist.c:42: warning: incompatible implicit declaration of built-in function 'fprintf'
gen-devlist.c:42: error: ’stderr' undeclared (first use in this function)
gen-devlist.c:46: warning: implicit declaration of function 'fgets'
gen-devlist.c:46: error: ’stdin' undeclared (first use in this function)
gen-devlist.c:48: warning: implicit declaration of function ’strchr'
gen-devlist.c:48: warning: incompatible implicit declaration of built-in function ’strchr'
gen-devlist.c:53: warning: implicit declaration of function ’strlen'
gen-devlist.c:53: warning: incompatible implicit declaration of built-in function ’strlen'
gen-devlist.c:65: warning: incompatible implicit declaration of built-in function ’strlen'
gen-devlist.c:75: warning: incompatible implicit declaration of built-in function 'fprintf'
gen-devlist.c:80: warning: incompatible implicit declaration of built-in function 'fprintf'
gen-devlist.c:81: warning: implicit declaration of function 'pq'
gen-devlist.c:82: warning: implicit declaration of function 'fputs'
gen-devlist.c:90: warning: incompatible implicit declaration of built-in function 'fprintf'
gen-devlist.c:96: warning: incompatible implicit declaration of built-in function ’strlen'
gen-devlist.c:103: warning: implicit declaration of function ’strcpy'
gen-devlist.c:103: warning: incompatible implicit declaration of built-in function ’strcpy'
gen-devlist.c:106: warning: incompatible implicit declaration of built-in function 'fprintf'
gen-devlist.c:109: warning: incompatible implicit declaration of built-in function 'fprintf'
gen-devlist.c:115: warning: incompatible implicit declaration of built-in function 'fprintf'
gen-devlist.c:126: warning: implicit declaration of function 'fclose'
make[4]: * [gen-devlist] Error 1
make[4]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/pci'
make[3]: * [first_rule] Error 2
make[3]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/pci'
make[2]: * [_subdir_pci] Error 2
make[2]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers'
make[1]: * [_dir_drivers] Error 2
make[1]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x'
make: * [linux] Ошибка 1
сам исходник:
/*
* Generate devlist.h and classlist.h from the PCI ID file.
*
* (c) 1999--2002 Martin Mares
*/
#include
#include
#define MAX_NAME_SIZE 79
static void
pq(FILE *f, const char *c)
{
while (*c) {
if (*c == '»’)
fprintf(f, «\\\»»);
else {
fputc(*c, f);
if (*c == '?' && c[1] == '?’) {
/* Avoid trigraphs */
fprintf(f, «\» \"»);
}
}
c++;
}
}
int
main(void)
{
char line[1024], *c, *bra, vend[8];
int vendors = 0;
int mode = 0;
int lino = 0;
int vendor_len = 0;
FILE *devf, *clsf;
devf = fopen(«devlist.h», «w»);
clsf = fopen(«classlist.h», «w»);
if (!devf || !clsf) {
fprintf(stderr, «Cannot create output file!\n»);
return 1;
}
while (fgets(line, sizeof(line)-1, stdin)) {
lino++;
if ((c = strchr(line, '\n’)))
*c = 0;
if (!line[0] || line[0] == '#’)
continue;
if (line[1] == ' ') {
if (line[0] == 'C' && strlen(line) > 4 && line[4] == ' ') {
vend[0] = line[2];
vend[1] = line[3];
vend[2] = 0;
mode = 2;
} else goto err;
}
else if (line[0] == '\t’) {
if (line[1] == '\t’)
continue;
switch (mode) {
case 1:
if (strlen(line) > 5 && line[5] == ' ') {
c = line + 5;
while (*c == ' ')
*c++ = 0;
if (vendor_len + strlen(c) + 1 > MAX_NAME_SIZE) {
/* Too long, try cutting off long description */
bra = strchr(c, '[');
if (bra && bra > c && bra[-1] == ' ')
bra[-1] = 0;
if (vendor_len + strlen(c) + 1 > MAX_NAME_SIZE) {
fprintf(stderr, «Line %d: Device name too long\n», lino);
fprintf(stderr, «%s\n», c);
return 1;
}
}
fprintf(devf, «\tDEVICE(%s,%s,\»», vend, line+1);
pq(devf, c);
fputs(«\»)\n», devf);
} else goto err;
break;
case 2:
if (strlen(line) > 3 && line[3] == ' ') {
c = line + 3;
while (*c == ' ')
*c++ = 0;
fprintf(clsf, «CLASS(%s%s, \«%s\»)\n», vend, line+1, c);
} else goto err;
break;
default:
goto err;
}
} else if (strlen(line) > 4 && line[4] == ' ') {
c = line + 4;
while (*c == ' ')
*c++ = 0;
if (vendors)
fputs(«ENDVENDOR()\n\n», devf);
vendors++;
strcpy(vend, line);
vendor_len = strlen(c);
if (vendor_len + 24 > MAX_NAME_SIZE) {
fprintf(stderr, «Line %d: Vendor name too long\n», lino);
return 1;
}
fprintf(devf, «VENDOR(%s,\»», vend);
pq(devf, c);
fputs(«\»)\n», devf);
mode = 1;
} else {
err:
fprintf(stderr, «Line %d: Syntax error in mode %d: %s\n», lino, mode, line);
return 1;
}
}
fputs(«ENDVENDOR()\n\
\n\
#undef VENDOR\n\
#undef DEVICE\n\
#undef ENDVENDOR\n», devf);
fputs(«\n#undef CLASS\n», clsf);
fclose(devf);
fclose(clsf);
return 0;
}
Если в исходнике удалить #include в ошибках просто пропадают строки
gen-devlist.c:7:20: error: string.h: No such file or directory
gen-devlist.c:8:19: error: stdio.h: No such file or directory
Потому что оно грузится до всех библиотек, если так просто посмотреть.
Этот исходник не имеет никакого отношения к коду ядра. Его надо компилировать отдельно, выглядит как самодостаточный.
Гигантское МЕГАСПАСИБО DimkaS-у!
Поставил libncurses5-dev и откомпилил этот нескастный gen-devlist.c
(дело я думаю в том, что вместе с этим пакетом был установлен как зависимость kernel-headers-чо-то-там — вот и нашелся на нужном месте stdio.h)
однако до конца все равно не докомпилил — споткнуля о какой-то gsasl.
ну с этим я пока сам поковыряюсь — благо в ссылочке которую я приводил чел рассказывает как с этим справится.
но я в этом посте еще появлюсь со своими недосборками.
когда соберу обязуюсь куда-нть выложить.
P.S.: а есть ли у дебиана установка «для разработчика» (как во фрях)? если есть — мож мне просто переставить систему (со всеми исходниками, библиотеками и компиляторами)?
Нужна система для разработчика без лишних заморочек — смотри в сторону Gentoo.
ОХ да простят меня модераторы (кажыся это уже флуд) — но я таки собрал ее!
Прошивка — один в один как у Д-Линка,
НО!
дата прошивки сегодняшнее число! (УРРРАААА!)
а поддержка принтера так и не скомпилилась (было много непонятных ошибок, а вернее он просто выплюнул в ошибки целый кусок кода с условными операторами, циклами и прочей ерундой).
заставить make НЕ СОБИРАТЬ поддержку принтера удалось вычистив почти полностью директорию ~/GPL_Di524up/user/LPRng-3.8.27
Makefile в этой директории пришлось сохранить, оставив в нем одну единственную запись «romfs:»
Ну теперь процесс налажен — надо в нее теперь впихнуть поддержку флэшек, ssh и можно выкладывать. (если кому интересно, могу и эту прошивку выложить)
To DimkaS:
Уж не знаю правильно это или нет, но данный код не видел ncurses и на другой машине (я тут решил продолжить муки на работе) — и это при установленных пакетах ncurses-base, ncurses-bin, ncurses-term, libncurses5, libncurses5-dev и libncursesw5. А команда make menuconfig заработала только после установки в системе обычного gcc (это при том что gcc-3.3 3.4 4.1 УЖЕ были установлены с самого начала! МАЛО ему 3-х последних версий компилятора — без первой собираться не буду НИВКАКУЮ!)
Хм.. обычно -dev пакеты решают проблемы.
А кто есть обычный gcc? Просто у меня в Дебе gcc начинается с gcc-2.95. Может, у тебя просто симлинка не было?
$ ls -l `which gcc`
lrwxrwxrwx 1 root root 7 Июн 26 01:08 /usr/bin/gcc -> gcc-4.3
To DimkaS:
Под обычным gcc я имел в виду тот который в SynapticPacketManager был указан без «-х.уу.zz» тоесть без версии и не был помечен как установленный.
Насчет симлинка — скорей всего так оно и было, точно не скажу.
Кстати после последующих сборок я был слегка разочарован — D-Link исходник то выложил, да вот тока все самое вкусное из него выкинул (например тотже sshd и другие проги)! Буду качать дистриб uClinux-а
Ну вот более-менее нормальная прошивка получилась.Как и обещал даю ссылочку, кому интересно — забирайте:
http://dlink-hack.narod.ru/ftproot.bix
на Di-524up ревизии A2 заливается отлично через веб интерфейс.
Плюсы: в ней есть теперь телнет и фтп сервера (через inetd), исправно опознает, пишет/читает флэшки (даже через хаб), родной вэб интерфейс сохранен.
Минусы: фтп работает только под рутом (логин/пасс: root/ghjibdrf), флэшки монтируются не в mnt или media, а в /var/usbmnt/ причем конечное название каталога зависит от модели флэшки (/var/usbmnt/disk0(JetFlashASDf321), /var/usbmnt/disk1(TranscendShit987abc) и т.д.), все директории кроме /var заблокированы на запись — включая /etc (то есть поменять какие-либо настройки кроме сетевых врядли выйдет)
На этом я думаю тему можно закрыть, всем огромное спасибо за помощь.