LINUX.ORG.RU

Вопросы по компиляции программ


0

0

Привет всем! Я только начал разбираться с Linux-программированием, поэтому у меня появилось несколько вопросов: 1. Сначала я написал простую программу, используя vi: #include int main (int argc, char** argv) { printf("........\n"); return 0; }

и назвал ее - rr.c потом откомпилировал ее:

linux:/home/terminator # gcc rr.c

появился исполняемый файл a.out, переименовал его в rr Попытался запустить его и получил следующее: -bash: rr: command not found

Потом я подумал немного и решил скопировать rr в папку /bin запустил ее оттуда и она сработала!!! Следовательно, вопрос - что, в Линуксе всегда нужно копировать файлы в папку /bin ? Можно ли обойти это ограничение и запустить программу в папке /home/user ?

2. Дальше я решил воспользоваться программой из журнала "Программист" от 04.2001, работающей в графическом режиме. Выглядит она так:

#include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xos.h> #include <stdio.h> #include <string.h> #define WND_START_X 100 #define WND_START_Y 100 #define WND_WIDTH 210 #define WND_HEIGHT 60 #define WND_MIN_WIDTH 210 #define WND_MIN_HEIGHT 60 #define WND_BORDER_WDT 5 #define WND_TITLE "KEY KODE TEST" #define WND_ICON_TITLE "KEY KODE TEST ICON" #define PRG_CLASS "KEY KODE TEST CLASS" int main (int argc,char* argv [ ]) { int ScreenNum; XEvent Event; Display* pDisplay; GC pGC; Window Wnd; unsigned long gkey; char* buff; buff = (char*)malloc(256); if ((pDisplay = XOpenDisplay(NULL)) == NULL) { puts("Can't connect to XServer!\n"); exit(1); } ScreenNum = DefaultScreen(pDisplay); Wnd = XCreateSimpleWindow(pDisplay, RootWindow(pDisplay,ScreenNum), WND_START_X, WND_START_Y, WND_WIDTH, WND_HEIGHT, WND_BORDER_WDT, BlackPixel(pDisplay,ScreenNum), WhitePixel(pDisplay,ScreenNum)); XSelectInput(pDisplay, Wnd, ExposureMask|KeyPressMask); XMapWindow(pDisplay,Wnd); while(1) { XNextEvent (pDisplay,&Event); switch(Event.type) { case Expose: if (Event.xexpose.count!=0) break; pGC = XCreateGC(pDisplay,Wnd,0,NULL); XSetForeground(pDisplay,pGC,BlackPixel(pDisplay,0)); XClearWindow(pDisplay,Wnd); XDrawString(pDisplay,Wnd,pGC,10,40,buff,strlen(buff)); XFreeGC(pDisplay,pGC); break; case KeyPress: pGC = XCreateGC(pDisplay,Wnd,0,NULL); XClearWindow(pDisplay,Wnd); gkey = Event.xkey.keycode; sprintf(buff,"%d\0",gkey); XDrawString(pDisplay,Wnd,pGC,10,40,buff,strlen(buff)); XFreeGC(pDisplay,pGC); break; } } } назвал ее test.c Попытался откомпилировать ее с помощью команды gcc -o test test.c -lX11 (точно как написано в журнале)

и получил сообщение: /usr/lib/gcc-lib/i486-slackware-linux/3.2.3/../../../../i486-slackware-linux/bin /ld: cannot find -lX11 collect2: ld returned 1 exit status

Выходит, что компилятор ищет libX11.a не в папке /usr/X11R6/lib/ (то есть там, где она действительно лежит - я проверял), а в папке /usr/lib/gcc-lib/.... Что же мне делать? Как заставить прогу компилироваться?

Ответ на: комментарий от enfundo

1. ./rr - это чтоб запустить из текущей директории или нужно набирать полный путь 2. Добавить к параметрам gcc -L/где_лежит_libX11

SatanClaus ★★★
()
Ответ на: комментарий от SatanClaus

Спасибо! теперь еще вопрос - я попытался компилировать вторую программу с помощью команды:

gcc -L/usr/X11R6/lib test.c

и получил несколько страниц сообщений вида:

/tmp/ccMe1wGC.o(.text+0x262): In function 'main':

: undefinded reference to 'XFreeGC'

collect2: ld returned 1 exit status

Выходит, компилятор нашел-таки библиотеку, но не может разрешить имена стандартных функций типа XFreeGC, XClearWindow, XDrawString. Я что-то не так делаю?

И еще один вопрос - по GTK+: я скачал pkg-config, распаковал его в папку /home/terminator/new и последовательно выполнил - ./configure --prefix=/opt/gtk

make

make install

CPPFLAGS="-I/opt/gtk/include"

LDFLAGS="-L/opt/gtk/lib"

PKG_CONFIG_PATH="/opt/gtk/lib/pkgconfig"

export CPPFLAGS LDFLAGS PKG_CONFIG_PATH

LD_LIBRARY_PATH="/opt/gtk/lib"

PATH="/opt/gtk/bin:$PATH"

export LD_LIBRARY_PATH PATH

- по порядку, как сказано на http://developer.gnome.org/doc/API/2.4/gtk/gtk-building.html

по-видимому, я опять что-то упустил и тестовая программа с www.gtk.org компилироваться не захотела.

Небольшая цитата с developer.gnome.org: " First make sure that you have the necessary external dependencies installed: pkg-config, GNU make, the JPEG, PNG, and TIFF libraries, FreeType, and, if necessary, libiconv and libintl." dependencies по-английски - зависимость, я прав? как я могу проверить, что у меня установлена зависимость? Короче, я не понимаю смысла этой фразы... Мне нужно установить все эти библиотеки? С другой стороны, дальше идет текст: "On a Linux system, it's quite likely you'll have all of these installed already except for pkg-config." Выходит, что на Линуксе все это есть за исключением pkg-config Странно, ведь я его уже скачал... То есть у меня есть все, за исключением понимания, что делать :) Еще цитата: "Then build and install the GTK+ libraries in the order: GLib, Pango, ATK, then GTK+" мне что, нужно все это скачивать? GTK+ не будет работать без GLib, Pango, ATK???

В голове - полная неразбериха - что устанавливать, в каком порядке... Подскажите, может, есть дока для начинающих - как начать работу с GTK+?

enfundo
() автор топика
Ответ на: комментарий от enfundo

Вы бы таки сначала pure C выучили, потом бы уже в сторону gtk, иксов и т.п. копали, а бес знаний си это рановато делать - бессмысленно!

anonymous
()
Ответ на: комментарий от SatanClaus

Большое спасибо! не додумался бы до такой конструкции: gcc -o test -L/usr/X11R6/lib -lX11 -I/usr/X11R6/include test.c

Может, порекомендуете книжку по теме - программирование для LINUX?

>Вы бы таки сначала pure C выучили

да я учил... целых 5 лет в универе... но Linux - не виндовс, сравните CTRL+F9 и gcc -o test -L/usr/X11R6/lib -lX11 -I/usr/X11R6/include test.c

enfundo
() автор топика
Ответ на: комментарий от enfundo

А вас уважаемый документацию в универе читать не учили?
обязательно получать a.out когда легче сделать так
gcc -o progname probsrc.c*

anonymous
()
Ответ на: комментарий от enfundo

>сравните CTRL+F9 и gcc -o test -L/usr/X11R6/lib -lX11 -I/usr/X11R6/include test.c

Makefile не дано сделать? :-)

human0id ★★★
()
Ответ на: комментарий от enfundo

> да я учил... целых 5 лет в универе... но Linux - не виндовс, сравните

от 'счастливчики'... нас к вынь даже не подпускают :)

Pi ★★★★★
()
Ответ на: комментарий от enfundo

2 enfundo: ну ты приколист! Ты - настоящий тролль! Я так долго уже давно не смеялся!!! Спасибо за хорошее настроение!

ЗЫ Иногда я тоже играю из себя троля.

anonymous
()
Ответ на: комментарий от enfundo

> В голове - полная неразбериха - что устанавливать, в каком порядке... Подскажите, может, есть дока для начинающих - как начать работу с GTK+?

Возьми из доки к GTK пару примеров стандартных - и сбей их - там даже написано, как запускать GCC с командной строки :))))

А vi лучше не используй - хотя бы Vim, или EMacs, если понравится :)

Spectr ★★★
()
Ответ на: комментарий от anonymous

Тролль обычно задает вопросы посложнее. С подковыркой.

SatanClaus ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.