Форум русскоязычного сообщества Ubuntu


Автор Тема: Проблема с svgalib  (Прочитано 667 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DeFANCE

  • Автор темы
  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Проблема с svgalib
« : 20 Апрель 2012, 17:30:56 »
Наверно, всех уже бесит этот вопрос... Но опять мучаюсь. Линковщик опять споткнулся.

sample.c
#include <stdio.h>
#include <vga.h>

int main() {
        vga_init();
        vga_setmode(5);
        vga_setcolor(4);
        vga_drawpixel(10, 10);
        sleep(3);
        vga_setmode(0);
        return 0;
}

jlacocb@jlacocb-VirtualBox:~/vgatest$ sudo apt-cache policy libsvga1
libsvga1:
  Installed: 1:1.4.3-31
  Candidate: 1:1.4.3-31
  Version table:
 *** 1:1.4.3-31 0
        500 http://ru.archive.ubuntu.com/ubuntu/ oneiric/universe i386 Packages
        100 /var/lib/dpkg/status

jlacocb@jlacocb-VirtualBox:~/vgatest$ uname -a
Linux jlacocb-VirtualBox 3.0.0-16-generic #29-Ubuntu SMP Tue Feb 14 12:49:42 UTC 2012 i686 i686 i386 GNU/Linux

jlacocb@jlacocb-VirtualBox:~/vgatest$ find /usr/lib/libvga*
/usr/lib/libvga.a
/usr/lib/libvgagl.a
/usr/lib/libvgagl.so
/usr/lib/libvgagl.so.1
/usr/lib/libvgagl.so.1.4.3
/usr/lib/libvga.so
/usr/lib/libvga.so.1
/usr/lib/libvga.so.1.4.3

jlacocb@jlacocb-VirtualBox:~/vgatest$ gcc -lvga -osample sample.c
/tmp/ccZ07RqH.o: In function `main':
sample.c:(.text+0xa): undefined reference to `vga_init'
sample.c:(.text+0x16): undefined reference to `vga_setmode'
sample.c:(.text+0x22): undefined reference to `vga_setcolor'
sample.c:(.text+0x36): undefined reference to `vga_drawpixel'
sample.c:(.text+0x4e): undefined reference to `vga_setmode'
collect2: ld returned 1 exit status

Пробовал на каком-то новом Минте - та же проблема. Причём, на 10.10 Убунте, я точно помню, всё работало. Где мой косяк, не подскажете?

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Проблема с svgalib
« Ответ #1 : 20 Апрель 2012, 18:03:09 »
jlacocb@jlacocb-VirtualBox:~/vgatest$ find /usr/lib/libvga*
/usr/lib/libvga.a
/usr/lib/libvgagl.a
/usr/lib/libvgagl.so
/usr/lib/libvgagl.so.1
/usr/lib/libvgagl.so.1.4.3
/usr/lib/libvga.so
/usr/lib/libvga.so.1
/usr/lib/libvga.so.1.4.3

jlacocb@jlacocb-VirtualBox:~/vgatest$ gcc -lvga -osample sample.c
/tmp/ccZ07RqH.o: In function `main':
sample.c:(.text+0xa): undefined reference to `vga_init'
sample.c:(.text+0x16): undefined reference to `vga_setmode'
sample.c:(.text+0x22): undefined reference to `vga_setcolor'
sample.c:(.text+0x36): undefined reference to `vga_drawpixel'
sample.c:(.text+0x4e): undefined reference to `vga_setmode'
collect2: ld returned 1 exit status

1. то, что библиотеки находятся find ещё вовсе не значит, что они автоматически будут находиться для связывания...
и посмотреть бы хорошо вот так, что оно есть:
$ ls -l /usr/lib/libvga*
- кто там ссылка и куда?

2. по вопросу связывания почитайте вот здесь: Библиотеки: связывание +/-1-2 раздела вокруг...

3. если совсем лень разбираться, можете поиграться с переменной окружения LD_LIBRARY_PATH (и даже LD_RUN_PATH с опциями -rpath и -rpath-link gcc при сборке)... ну, в общем, всё это описано по ссылке, что я показал.

Оффлайн DeFANCE

  • Автор темы
  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Проблема с svgalib
« Ответ #2 : 20 Апрель 2012, 18:49:41 »
0.
$ ls -l /usr/lib/libvga*
-rw-r--r-- 1 root root 660554 2011-06-17 02:34 /usr/lib/libvga.a
-rw-r--r-- 1 root root  90798 2011-06-17 02:34 /usr/lib/libvgagl.a
lrwxrwxrwx 1 root root     17 2011-06-17 02:34 /usr/lib/libvgagl.so -> libvgagl.so.1.4.3
lrwxrwxrwx 1 root root     17 2011-06-17 02:34 /usr/lib/libvgagl.so.1 -> libvgagl.so.1.4.3
-rw-r--r-- 1 root root  69104 2011-06-17 02:34 /usr/lib/libvgagl.so.1.4.3
lrwxrwxrwx 1 root root     15 2011-06-17 02:34 /usr/lib/libvga.so -> libvga.so.1.4.3
lrwxrwxrwx 1 root root     15 2011-06-17 02:34 /usr/lib/libvga.so.1 -> libvga.so.1.4.3
-rw-r--r-- 1 root root 394160 2011-06-17 02:34 /usr/lib/libvga.so.1.4.3

1.
$ gcc -L/usr/lib -osample sample.c
/tmp/ccKgak5a.o: In function `main':
sample.c:(.text+0xa): undefined reference to `vga_init'
sample.c:(.text+0x16): undefined reference to `vga_setmode'
sample.c:(.text+0x22): undefined reference to `vga_setcolor'
sample.c:(.text+0x36): undefined reference to `vga_drawpixel'
sample.c:(.text+0x4e): undefined reference to `vga_setmode'
collect2: ld returned 1 exit status

2.
$ export LD_LIBRARY_PATH="/usr/lib"
$ echo $LD_LIBRARY_PATH
/usr/lib
$ gcc -osample sample.c
/tmp/cc6yioMz.o: In function `main':
sample.c:(.text+0xa): undefined reference to `vga_init'
sample.c:(.text+0x16): undefined reference to `vga_setmode'
sample.c:(.text+0x22): undefined reference to `vga_setcolor'
sample.c:(.text+0x36): undefined reference to `vga_drawpixel'
sample.c:(.text+0x4e): undefined reference to `vga_setmode'
collect2: ld returned 1 exit status

Внезапно оказалось, что ни с одной библиотекой ничего связываться не хочет. О_о
Точно также падают и boost, и GL. Система практически девственно чистая. Нет ничего, кроме компилятора и вышеописанных библиотек. Особо напрягает первый пункт в этом посте. Я же сказал чётко, где искать библиотеки. Или я торможу?

Пользователь решил продолжить мысль 20 Апрель 2012, 19:12:53:
Проблема оказалась в моих кривых руках и незнании.

Решение кроется в линковщике, а точнее, в порядке параметров.
http://webpages.charter.net/ppluzhnikov/linker.html

Следующая команда отлично работает, всё компилирует.
$ gcc -osample sample.c -lvga
Ну или так:
$ gcc -c sample.c
$ gcc -osample sample.o -lvga

Хотя это достаточно интересный факт. Я обнаружил эту фигню толко сейчас, когда решил посмотреть свои же старые демки, написанные пару лет назад. Собственно, есть проект с Makefile'ом. Он работает на старой системе (к которой пару лет и не прикасался). Собирается на ура и сейчас. Перепроверил несколько раз. На новой машине вылезает вот такая фигня.

Вопрос, думаю, решён.
« Последнее редактирование: 20 Апрель 2012, 19:12:53 от DeFANCE »

 

Страница сгенерирована за 0.068 секунд. Запросов: 25.