Титла: Проблем с компилиране Публикувано от: Hapkoc в Mar 26, 2005, 20:59 Имам следната програма:
--- cut: xkbf.c --- #include <stdio.h> #include <X11/Xlib.h> #include <X11/XKBlib.h> #include <X11/extensions/XKBrules.h> void load_rules(char *file) { XkbRF_RulesPtr rules = XkbRF_Load(file, "", True, True); if (rules == 0) { printf("could not load rules\n"); return; } int i; for (i = 0; i < rules->models.num_desc; ++i) printf("model: %s\n", rules->models.desc.desc); for (i = 0; i < rules->layouts.num_desc; ++i) printf("layout: %s\n", rules->layouts.desc.desc); for (i = 0; i < rules->options.num_desc; ++i) printf("options: %s\n", rules->options.desc.desc); XkbRF_Free(rules, True); } int main() { load_rules("/etc/X11/xkb/rules/xfree86"); return 0; } --- cut: xkbf.c --- Компилирайки я със следната команда получавам това: $ gcc -L/usr/X11R6/lib -lxkbfile xkbf.c -o xkbf /tmp/cc6EXMLu.o(.text+0x2c): In function `load_rules': : undefined reference to `XkbRF_Load' /tmp/cc6EXMLu.o(.text+0x168): In function `load_rules': : undefined reference to `XkbRF_Free' collect2: ld returned 1 exit status Ще съм много благодарен някой по-запознат със C да ме осветли къде бъркам точно. ![]() Благодаря предварително за вниманието. ![]() п.с.: Системата ми е debian unstable (2.6.7). Съществува /usr/X11R6/lib/libxkbfile.a и $ strings /usr/X11R6/lib/libxkbfile.a дава, че има XkbRF_Load XkbRF_Free. Титла: Проблем с компилиране Публикувано от: the_real_maniac в Mar 26, 2005, 22:05 Като синтаксис изглежда ОК, освен не мога да ти гарантирам за функции от Xlib и подобни , които искаш да ползваш.
Явно нещо в начина ти да ги викаш/ползваш не е вред, но пък не пищи за неправилен тип променливи ... Успех.! /ще го погледна отново по-късно , но сега съм зает и го прегледах на бързо. Не ти гарантирам на 100% горното , но е чисто и просто моето мнение ![]() edit: Ами разгледах по-обстойно този ред: XkbRF_RulesPtr rules = XkbRF_Load(file, " ", True, True); т.е реда , където реално ползваш Xlib.h,... и всичко е наред. Проверих за типа на променливите и т.н , ами наред е. Малко поразрових google и това, което там намерих като предположения в подобни случей е, че linker-а не си върши работата. http://www.ecommerce-websource.com/ecommerce/source-setxkbmap.htm Виж дали това няма да ти свърши работа. Дано се справиш .! Титла: Проблем с компилиране Публикувано от: Hapkoc в Mar 26, 2005, 23:00 the_real_maniac, благодаря за вниманието.
![]() Като синтаксис е 100% ок програмата, иначе щеше да гръмне при компилацията, а то реве при линкването, което по моето скромно мнение ще рече, че не може да си намери ноебходимите библиотеки. Ако има някакви ентусиасти, които имат желание да пробват да компилират програмата при тях много ще съм задължен, особено ако постигнат някакъв успех. ![]() Поздрави Титла: Проблем с компилиране Публикувано от: betso в Mar 27, 2005, 01:00 Компилира се без проблем на CRUX-2.0, kernel-2.6.6, xorg-6.8.1-1, gcc-3.3.3-1, glibc-2.3.3-1.
Не дава никаква грешка! Ето и output-а (съкратен):
Титла: Проблем с компилиране Публикувано от: the_real_maniac в Mar 27, 2005, 12:28
Като вземеш впредвид това, което ти каза за ld , което аз намерих в google "Малко поразрових google и това, което там намерих като предположения в подобни случей е, че linker-а не си върши работата." и което казва besto се оказва , че проблема в ld/link-ването. Титла: Проблем с компилиране Публикувано от: betso в Mar 27, 2005, 15:58 Няма проблеми с компилацията и на машината на мойта приятелка:
archlinux-0.7 Wombat # pacman -Q glibc gcc xorg glibc 2.3.4-2 gcc 3.4.3-2 xorg 11R6.8.2-2 # uname -r 2.6.10 Успех! :) Титла: Проблем с компилиране Публикувано от: the_real_maniac в Mar 27, 2005, 17:29 Хехе
![]() ![]() ![]() Ами Наркос ето нещо ,което забравих да напиша , а ми направи впечатление още в началото като четох темата: Аз -> Debian unstable/SID - linux-2.6.7_custom_ gcc-3.3 (GCC) 3.3.5 (Debian 1:3.3.5-11) GNU ld version 2.15 Така че предполагам нещо в пакетите на Дебиан: - някой конф. файл / стойности по подразбиране не както трябва; - компилиране без необходима опция / по нужен начин. Но това са само предположния, макар че от горните мнения аз стигам до това заключение ![]() Решението ще е интересно./предпоалгам ![]() Титла: Проблем с компилиране Публикувано от: solley в Mar 27, 2005, 17:48 /offtopic
the_real_maniac, archlinux е наистина интересна дистрибуция (но и доста лесна за обслужване) и да си призная малко ме е срам да казвам, че съм с нея, след като съм била 3 години със slackware. :) Титла: Проблем с компилиране Публикувано от: JOKe в Mar 27, 2005, 22:00
бреи приателка използваша arch тва не е за изпускане :П Титла: Проблем с компилиране Публикувано от: Hapkoc в Mar 27, 2005, 22:26 Благодаря на всички за отговорите.
Извода до който стигнах е, че има разлика в бибилиотеките на XFree86 и xorg, а както знаем debian продължава да е с XFree86 . ![]() Значи поразрових малко в нета разбрах следното - библиотеки завършващи на .a са за static linking. Странното обаче е, че като дам -static, -Wl,-static, -Bstatic и подобните вариации продължава да го дава това нещо (независимо дали ld се вика от gcc или го викам отделно). Всъщност може би трябва да спомена, че се оправих с проблема. ![]() $ gcc -L/usr/X11R6/lib -lX11 -lXext xkbf.c /usr/X11R6/lib/libxkbfile.a -o xkbf Т.е. аз това го разбирам, че libxkbfile.a се подава като source file на gcc. Не разбирам обаче защо... Тук ще трябва май да се намеси някой разбирач на C да хвърли малко светлина по въпроса. Както и да е, пак благодаря на всички отговорили. Поздрави. ![]() Титла: Проблем с компилиране Публикувано от: в Mar 27, 2005, 23:01 gcc xkbf.c -o xkbf -L /usr/X11R6/lib -lX11 -lXext -lxkbfile
или gcc xkbf.c -o xkbf -L/usr/X11R6/lib -lX11 -lXext -lxkbfile_pic между другото if (rules == 0) изглежда по-добре така if (!rules), пък и == може да го объркаш без да изкаш с = Титла: Проблем с компилиране Публикувано от: rpetrov в Mar 27, 2005, 23:58
Няма нищо общо с "C". Това зависи от програмата за свързване. При реда -lxkbfile xkbf.o първо си задал архива. Тъй като пръвоначално няма несвързани функции от архива не се изважда нищо. После следва xkbf.о - вече се търсят методите XkbRF_Load и XkbRF_Free, но вече късно да се намерят. Затова правилния ред е xkbf.o -lxkbfile: след xkbf.o се търсят XkbRF_Load и XkbRF_Free. Следва архива xkbfile, който ги съдържа и от него се изваждат модулите. Титла: Проблем с компилиране Публикувано от: Hapkoc в Mar 28, 2005, 00:34 @{rpetrov|hardcored d3b1l!@n}: Ясно, мерси за информацията.
@hardcored d3b1l!@n: относно rules == 0 - абсолютно си прав. Просто съм доста начинаещ в C. ![]() Титла: Проблем с компилиране Публикувано от: the_real_maniac в Mar 28, 2005, 17:00
Няма нищо общо с "C". Това зависи от програмата за свързване. При реда -lxkbfile xkbf.o първо си задал архива. Тъй като пръвоначално няма несвързани функции от архива не се изважда нищо. После следва xkbf.о - вече се търсят методите XkbRF_Load и XkbRF_Free, но вече късно да се намерят. Затова правилния ред е xkbf.o -lxkbfile: след xkbf.o се търсят XkbRF_Load и XkbRF_Free. Следва архива xkbfile, който ги съдържа и от него се изваждат модулите. -------------------------------------------------------- Край на цитата/ не знам защо така се обърка работата , аз просто дадох Quote ![]() ![]() ------------------------------------------------------ Аз нещо , обаче не те разбрах , да не кажа че ми звучиш доста объркващо :? Моля те напиши (целия) кой ред коментираш и да нипишеш двата варианта , за които после говориш (грешния и вярния). Извинявай, но наистина ми звучиш объркващо :? Титла: Проблем с компилиране Публикувано от: rpetrov в Mar 28, 2005, 17:52
Всъщност няма грешка никъде ;-). Още малко информация от ld(1):
Конкретно за случая е достатъчно, архива (библиотеката) xkbfile да е след обектните файлове, които използват функции намиращи се в него (нея). П.П.: Има и по-заплетени ситуации: на един юникс трябваше да се задават архивите така: -linet -lX11 -l..... -linet, т.е. inet се задава два пъти: преди и след X библиотеките. Титла: Проблем с компилиране Публикувано от: the_real_maniac в Mar 28, 2005, 19:32 Хехе - говори ли сме за различни неща и АЗ ПАК НЕ РАЗБРАХ КОЙ ТОЧНО ред gcc коментираше по-горе !
Аз лично говорех за този _РЕД_: /от първия пост на тази тема gcc -o xkbf -L/usr/X11R6/lib -lxkbfile xkbf.c И реално погледнато това, което изглежда липсва е -lX11 (след -lxkbfile). Та пак ще попитам макар и вече 'нещото' да работи. За кой команден ред gcc се отнасяще по-горния ти/Ви ![]() Относно последния / горния ти пост го разбрах напълно. Трябваше да прочетем man ld , заслужаваме един бой*. * но както се вижда се предаваме и без такъв ![]() @Наркос: $gcc -o xkbf -L/usr/X11R6/lib -lxkbfile -lX11 xkbf.c //no errors ,no warnings ! ![]() $./xkbf.c
Това е ![]() Титла: Проблем с компилиране Публикувано от: rpetrov в Mar 28, 2005, 23:49
Да за същия ред, но коментирах само част от него: "-lxkbfile xkbf.c", като вместо xkbf.c използвах xkbf.о, което не променя нещата.
Да така е, но се разбира при: "gcc -o xkbf -L/usr/X11R6/lib xkbf.c -lxkbfile", т.е. вече libxkbfile.a е след xkbf.о. Понеже съществува динамична библиотека libX11.so, няма значение къде ще се постави -lX11 (е може да се наложи някое -Lпът_до_библиотеките преди това). Това трябва да работи "gcc -L/usr/X11R6/lib -lX11 xkbf.c -lxkbfile -o xkbf" Ако се укаже обаче, че се иска само статични библиотеки, то тогава реда има значение. Не става с: 1.) "gcc -static -L/usr/X11R6/lib -lX11 xkbf.c -lxkbfile -o xkbf" 2.) "gcc -static -L/usr/X11R6/lib xkbf.c -lX11 -lxkbfile -o xkbf" защото "libX11.a" трябва да е след "libxkbfile.а". Става с: "gcc -static -L/usr/X11R6/lib xkbf.c -lxkbfile -lX11 -o xkbf" Считам темата за изчерпана. Титла: Проблем с компилиране Публикувано от: the_real_maniac в Mar 29, 2005, 00:51 Да извинявай за малкото повече писане, но ти благодаря за отделеното време.!
Предположих xkbf.o -> .output, но се бях объркал вече и ... се стигна до тук. Изясни ми се. Титла: Проблем с компилиране Публикувано от: lanselot в Apr 18, 2005, 22:43 хих
![]()
и това не ще да се компилира под гцц-то дето идва с Mandtake 10.1 Official , a под Виндовс с MinGW и с gcc-то на DJGPP си го компилира и даже извежда верен резултат. а ако поправя реда : return sqrt(k1+k2); на return sqrt(16); не ми дава никаква грешка. |