Автор Тема: Проблем с компилиране  (Прочетена 3346 пъти)

Hapkoc

  • Напреднали
  • *****
  • Публикации: 2117
    • Профил
Проблем с компилиране
« -: 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 да ме осветли къде бъркам точно. '<img'>

Благодаря предварително за вниманието. '<img'>

п.с.: Системата ми е debian unstable (2.6.7). Съществува /usr/X11R6/lib/libxkbfile.a и
$ strings /usr/X11R6/lib/libxkbfile.a
дава, че има XkbRF_Load XkbRF_Free.
Активен

the_real_maniac

  • Напреднали
  • *****
  • Публикации: 1258
  • Kernel panic, me - no panic ;-) :-)
    • Профил
Проблем с компилиране
« Отговор #1 -: Mar 26, 2005, 22:05 »
Като синтаксис изглежда ОК, освен не мога да ти гарантирам за  функции от Xlib и подобни , които искаш да ползваш.

Явно нещо в начина ти да ги викаш/ползваш не е вред, но пък не пищи за неправилен тип променливи ...

Успех.!

/ще го погледна отново по-късно , но сега съм зает и го прегледах на бързо. Не ти гарантирам на 100% горното , но е чисто и просто моето мнение '<img'>

edit:

Ами разгледах по-обстойно този ред:
 XkbRF_RulesPtr rules = XkbRF_Load(file, " ", True, True);

т.е реда , където реално ползваш Xlib.h,... и всичко е наред.
Проверих за типа на променливите и т.н , ами наред е.
Малко поразрових google и това, което там намерих като предположения в подобни случей е, че linker-а не си върши работата.

http://www.ecommerce-websource.com/ecommerce/source-setxkbmap.htm

Виж дали това няма да ти свърши работа.

Дано се справиш .!
Активен

Powered by Debian GNU / LINUX /// Intel inside ...

„Насилието е последното убежище на некомпетентността“ - Айзък Азимов (1920 — 1992)

Hapkoc

  • Напреднали
  • *****
  • Публикации: 2117
    • Профил
Проблем с компилиране
« Отговор #2 -: Mar 26, 2005, 23:00 »
the_real_maniac, благодаря за вниманието. '<img'>

Като синтаксис е 100% ок програмата, иначе щеше да гръмне при компилацията, а то реве при линкването, което по моето скромно мнение ще рече, че не може да си намери ноебходимите библиотеки.

Ако има някакви ентусиасти, които имат желание да пробват да компилират програмата при тях много ще съм задължен, особено ако постигнат някакъв успех. '<img'>)))

Поздрави
Активен

betso

  • Напреднали
  • *****
  • Публикации: 281
    • Профил
Проблем с компилиране
« Отговор #3 -: 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-а (съкратен):
Примерен код
# ./xkbf
model: Generic 101-key PC
...
model: Yahoo! Internet Keyboard
layout: U.S. English
...
layout: PC-98xx Series
options: Group Shift/Lock behavior
...
options: Special keys (Ctrl+Alt+<key>) handled in a server.
#
Активен

the_real_maniac

  • Напреднали
  • *****
  • Публикации: 1258
  • Kernel panic, me - no panic ;-) :-)
    • Профил
Проблем с компилиране
« Отговор #4 -: Mar 27, 2005, 12:28 »
Цитат (Hapkoc @ Март 27 2005,00:00)
the_real_maniac, благодаря за вниманието. '<img'>

Като синтаксис е 100% ок програмата, иначе щеше да гръмне при компилацията, а то реве при линкването, което по моето скромно мнение ще рече, че не може да си намери ноебходимите библиотеки.

Ако има някакви ентусиасти, които имат желание да пробват да компилират програмата при тях много ще съм задължен, особено ако постигнат някакъв успех. '<img'>)))

Поздрави

Като вземеш впредвид това, което ти каза за ld , което аз намерих в google "Малко поразрових google и това, което там намерих като предположения в подобни случей е, че linker-а не си върши работата." и което казва besto се оказва , че проблема в ld/link-ването.
Активен

Powered by Debian GNU / LINUX /// Intel inside ...

„Насилието е последното убежище на некомпетентността“ - Айзък Азимов (1920 — 1992)

betso

  • Напреднали
  • *****
  • Публикации: 281
    • Профил
Проблем с компилиране
« Отговор #5 -: 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

  • Напреднали
  • *****
  • Публикации: 1258
  • Kernel panic, me - no panic ;-) :-)
    • Профил
Проблем с компилиране
« Отговор #6 -: Mar 27, 2005, 17:29 »
Хехе '<img'> Поздрави на приятелката ти '<img'> Интересна дистрибуция си е избрала и ползва ! '<img'>

Ами Наркос ето нещо ,което забравих да напиша , а ми направи впечатление още в началото като четох темата:

Аз -> 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

Така че предполагам нещо в пакетите на Дебиан:
 - някой конф. файл / стойности по подразбиране не както трябва;
 - компилиране без необходима опция / по нужен начин.

Но това са само предположния, макар че от горните мнения аз стигам до това заключение '<img'> .

Решението ще е интересно./предпоалгам '<img'>
Активен

Powered by Debian GNU / LINUX /// Intel inside ...

„Насилието е последното убежище на некомпетентността“ - Айзък Азимов (1920 — 1992)

solley

  • Участници
  • ***
  • Публикации: 9
    • Профил
Проблем с компилиране
« Отговор #7 -: Mar 27, 2005, 17:48 »
/offtopic

the_real_maniac, archlinux е наистина интересна дистрибуция (но и доста лесна за обслужване) и да си призная малко ме е срам да казвам, че съм с нея, след като съм била 3 години със slackware. :)
Активен

JOKe

  • Напреднали
  • *****
  • Публикации: 537
    • Профил
Проблем с компилиране
« Отговор #8 -: Mar 27, 2005, 22:00 »
Цитат (betso @ Март 27 2005,16: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

Успех!
'<img'>

бреи приателка използваша arch тва не е за изпускане :П
Активен

" May The Source Be With You . "

Hapkoc

  • Напреднали
  • *****
  • Публикации: 2117
    • Профил
Проблем с компилиране
« Отговор #9 -: Mar 27, 2005, 22:26 »
Благодаря на всички за отговорите.

Извода до който стигнах е, че има разлика в бибилиотеките на XFree86 и xorg, а както знаем debian продължава да е с XFree86 . '<img'>

Значи поразрових малко в нета разбрах следното - библиотеки завършващи на .a са за static linking. Странното обаче е, че като дам -static, -Wl,-static, -Bstatic и подобните вариации продължава да го дава това нещо (независимо дали ld се вика от gcc или го викам отделно).

Всъщност може би трябва да спомена, че се оправих с проблема. '<img'> Това стана по следния начин:

$ gcc -L/usr/X11R6/lib -lX11 -lXext xkbf.c /usr/X11R6/lib/libxkbfile.a -o xkbf

Т.е. аз това го разбирам, че libxkbfile.a се подава като source file на gcc. Не разбирам обаче защо...

Тук ще трябва май да се намеси някой разбирач на C да хвърли малко светлина по въпроса.

Както и да е, пак благодаря на всички отговорили.

Поздрави. '<img'>
Активен

  • Гост
Проблем с компилиране
« Отговор #10 -: 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

  • Напреднали
  • *****
  • Публикации: 571
    • Профил
    • WWW
Проблем с компилиране
« Отговор #11 -: Mar 27, 2005, 23:58 »
Цитат (Hapkoc @ Март 27 2005,22:26)

Всъщност може би трябва да спомена, че се оправих с проблема. '<img'> Това стана по следния начин:

$ gcc -L/usr/X11R6/lib -lX11 -lXext xkbf.c /usr/X11R6/lib/libxkbfile.a -o xkbf

Т.е. аз това го разбирам, че libxkbfile.a се подава като source file на gcc. Не разбирам обаче защо...

Тук ще трябва май да се намеси някой разбирач на C да хвърли малко светлина по въпроса.


Няма нищо общо с "C".
Това зависи от програмата за свързване.
При реда -lxkbfile xkbf.o първо си задал архива.
Тъй като пръвоначално няма несвързани функции от архива не се изважда нищо. После следва xkbf.о - вече се търсят методите  XkbRF_Load и XkbRF_Free, но вече късно да се намерят.

Затова правилния ред е xkbf.o -lxkbfile: след xkbf.o се търсят
XkbRF_Load и XkbRF_Free. Следва архива xkbfile, който ги съдържа и от него се изваждат модулите.
Активен

Hapkoc

  • Напреднали
  • *****
  • Публикации: 2117
    • Профил
Проблем с компилиране
« Отговор #12 -: Mar 28, 2005, 00:34 »
@{rpetrov|hardcored d3b1l!@n}: Ясно, мерси за информацията.

@hardcored d3b1l!@n: относно rules == 0 - абсолютно си прав. Просто съм доста начинаещ в C. '<img'>
Активен

the_real_maniac

  • Напреднали
  • *****
  • Публикации: 1258
  • Kernel panic, me - no panic ;-) :-)
    • Профил
Проблем с компилиране
« Отговор #13 -: Mar 28, 2005, 17:00 »
Цитат (rpetrov @ Март 28 2005,00:58)
Цитат на: Hapkoc,Март 27 2005,22:26
Всъщност може би трябва да спомена, че се оправих с проблема. '<img'> Това стана по следния начин:

$ gcc -L/usr/X11R6/lib -lX11 -lXext xkbf.c /usr/X11R6/lib/libxkbfile.a -o xkbf

Т.е. аз това го разбирам, че libxkbfile.a се подава като source file на gcc. Не разбирам обаче защо...

Тук ще трябва май да се намеси някой разбирач на C да хвърли малко светлина по въпроса.


Няма нищо общо с "C".
Това зависи от програмата за свързване.
При реда -lxkbfile xkbf.o първо си задал архива.
Тъй като пръвоначално няма несвързани функции от архива не се изважда нищо. После следва xkbf.о - вече се търсят методите  XkbRF_Load и XkbRF_Free, но вече късно да се намерят.

Затова правилния ред е xkbf.o -lxkbfile: след xkbf.o се търсят
XkbRF_Load и XkbRF_Free. Следва архива xkbfile, който ги съдържа и от него се изваждат модулите.
--------------------------------------------------------
Край на цитата/ не знам защо така се обърка работата , аз просто дадох Quote '<img'> '<img'>
------------------------------------------------------
Аз нещо , обаче не те разбрах , да не кажа че ми звучиш доста объркващо :?

Моля те напиши (целия) кой ред коментираш и да нипишеш двата варианта , за които после говориш (грешния и вярния).

Извинявай, но наистина ми звучиш объркващо :?
Активен

Powered by Debian GNU / LINUX /// Intel inside ...

„Насилието е последното убежище на некомпетентността“ - Айзък Азимов (1920 — 1992)

rpetrov

  • Напреднали
  • *****
  • Публикации: 571
    • Профил
    • WWW
Проблем с компилиране
« Отговор #14 -: Mar 28, 2005, 17:52 »
Цитат (the_real_maniac @ Март 28 2005,17<!--emo&':0')
Аз нещо , обаче не те разбрах , да не кажа че ми звучиш доста объркващо :?

Моля те напиши (целия) кой ред коментираш и да нипишеш двата варианта , за които после говориш (грешния и вярния).

Извинявай, но наистина ми звучиш объркващо :?

Всъщност няма грешка никъде ;-). Още малко информация от ld(1):
Цитат
--start-group archives --end-group
 The archives should be a list of archive files. They may be either explicit file names, or -l options.

 The specified archives are searched repeatedly until no new undefined references are created. Normally, an archive is searched only once in the order that it is specified on the command line. If a symbol in that archive is needed to resolve an undefined symbol referred to by an object in an archive that appears later on the command line, the linker would not be able to resolve that reference. By grouping the archives, they all be searched repeatedly until all possible references are resolved.

 Using this option has a significant performance cost. It is best to use it only when there are unavoidable circular references between two or more archives.

Конкретно за случая е достатъчно, архива (библиотеката) xkbfile да е след обектните файлове, които използват функции намиращи се в него (нея).

П.П.: Има и по-заплетени ситуации: на един юникс трябваше да се задават архивите така: -linet -lX11 -l.....  -linet, т.е. inet се задава два пъти: преди и след X библиотеките.
Активен