Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: Hapkoc в Mar 26, 2005, 20:59



Титла: Проблем с компилиране
Публикувано от: 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-а (съкратен):
Примерен код
# ./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 в Mar 27, 2005, 12:28
Цитат (Hapkoc @ Март 27 2005,00:00)
the_real_maniac, благодаря за вниманието. :)

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

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

Поздрави

Като вземеш впредвид това, което ти каза за 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
Цитат (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

Успех!
:)

бреи приателка използваша 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
Цитат (Hapkoc @ Март 27 2005,22:26)

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

$ 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 в Mar 28, 2005, 00:34
@{rpetrov|hardcored d3b1l!@n}: Ясно, мерси за информацията.

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


Титла: Проблем с компилиране
Публикувано от: the_real_maniac в Mar 28, 2005, 17:00
Цитат (rpetrov @ Март 28 2005,00:58)
Цитат на: Hapkoc,Март 27 2005,22:26
Всъщност може би трябва да спомена, че се оправих с проблема. :) Това стана по следния начин:

$ 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 :) :D
------------------------------------------------------
Аз нещо , обаче не те разбрах , да не кажа че ми звучиш доста объркващо :?

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

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


Титла: Проблем с компилиране
Публикувано от: rpetrov в 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 библиотеките.


Титла: Проблем с компилиране
Публикувано от: the_real_maniac в Mar 28, 2005, 19:32
Хехе - говори ли сме за различни неща и АЗ ПАК НЕ РАЗБРАХ КОЙ ТОЧНО ред gcc коментираше по-горе !

Аз лично говорех за този _РЕД_:
/от първия пост на тази тема

gcc -o xkbf -L/usr/X11R6/lib -lxkbfile xkbf.c

И реално погледнато това, което изглежда липсва е -lX11 (след -lxkbfile).

Та пак ще попитам макар и вече 'нещото' да работи.
За кой команден ред gcc се отнасяще по-горния ти/Ви :) коментар ?

Относно последния / горния ти пост го разбрах напълно.
Трябваше да прочетем man ld , заслужаваме един бой*.

* но както се вижда се предаваме и без такъв :p

@Наркос:

$gcc -o xkbf -L/usr/X11R6/lib -lxkbfile -lX11 xkbf.c
//no errors ,no warnings ! :)
$./xkbf.c
Цитат

./xkbf
model: Generic 101-key PC
model: Generic 102-key (Intl) PC

[cut]

model: Trust Direct Access Keyboard
model: Yahoo! Internet Keyboard
layout: U.S. English
layout: U.S. English w/ ISO9995-3

[cut]

layout: Yugoslavian
layout: PC-98xx Series
options: Group Shift/Lock behavior
options: Left Alt key switches group while pressed

[cut]

options: Menu is Compose
options: Caps Lock is Compose
$


Това е :)


Титла: Проблем с компилиране
Публикувано от: rpetrov в Mar 28, 2005, 23:49
Цитат (the_real_maniac @ Март 28 2005,19:32)
Хехе - говори ли сме за различни неща и АЗ ПАК НЕ РАЗБРАХ КОЙ ТОЧНО ред gcc коментираше по-горе !

Аз лично говорех за този _РЕД_:
/от първия пост на тази тема

gcc -o xkbf -L/usr/X11R6/lib -lxkbfile xkbf.c

Да за същия ред, но коментирах само част от него: "-lxkbfile xkbf.c", като вместо xkbf.c използвах xkbf.о, което не променя нещата.

Цитат
И реално погледнато това, което изглежда липсва е -lX11 (след -lxkbfile).

Да така е, но се разбира при:
"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
хих :) гледам тази тема и се сетих,че днес и аз имах един много странен проблем
Примерен код

...
#include <math.h>
...

double distance(double x1, double y1, double x2, double y2)
{
    double k1 = (x1-x2)*(x1-x2);
    double k2 = (y1-y2)*(y1-y2);
    
    return sqrt(k1+k2);
}

и това не ще да се компилира под гцц-то дето идва с Mandtake 10.1 Official  , a под Виндовс с MinGW и с gcc-то на DJGPP си го компилира и даже извежда верен резултат. а ако поправя реда :
    return sqrt(k1+k2);
на
    return sqrt(16);
не ми дава никаква грешка.