Складання коду з apue


12

Щойно я почав читати книгу: Розширене програмування в середовищі UNIX® . Я хотів спробувати запустити перший приклад коду. Я працюю Scientific Linux 6.4.

Я завантажив вихідний код і, як там сказано в його README, я побіг makeу нестисненому файлі.

Я написав першу програму (макетна lsкоманда)

#include "./include/apue.h"
#include <dirent.h>

int
main(int argc, char *argv[])
{
    DIR           *dp;
    struct dirent *dirp;

    if(argc!=2)
        err_quit("usage: test directory_name");

    if((dp=opendir(argv[1]))==NULL)
        err_sys("Can't open %s", argv[1]);

    while((dirp=readdir(dp))!=NULL)
        printf("%s\n", dirp->d_name);

    closedir(dp);
    return 0;
}

і помістіть його у нестиснений файл. Як порадив книгу я побіг: gcc myls.c. Але я отримую цю помилку:

# gcc myls.c
/tmp/ccWTWS2I.o: In function `main':
test.c:(.text+0x20): undefined reference to `err_quit'
test.c:(.text+0x5b): undefined reference to `err_sys'
collect2: ld returned 1 exit status

Мені хотілося знати, як я можу виправити цю проблему. Я також хочу мати можливість запускати код, який я записую в будь-який каталог.


Звідки ви очікуєте err_{quit,sys}приїхати?
Кріс Даун

У нестисненому вихідному коді є каталог:, includeщо має файл заголовка apue.h. Але це єдиний файл у цьому каталозі. Я не розумію, де фактичні визначення функцій! Я думав, що хтось, можливо, знайомий зі структурою файлів вихідного коду цієї книги тут.
makhlaghi

У .hфайлах включають protypes для функцій. Їх реалізація знаходиться у файлах .soабо .aфайлах, які потрібно мати у вікні. Це динамічні та статичні бібліотеки, які містять функції.
slm

Що навіть є apue.h?
голоси

Відповіді:


13

Короткий огляд того, як писати та компілювати програми в розширеному програмуванні в середовищі UNIX® , завдяки slm за допомогу мені зрозуміти кроки. Ви можете завантажити вихідний код звідси . Я хочу, щоб ця інформація була включена до частини додатка b до книги, де пояснюється файл заголовка.

Нестиснений файл містить каталоги з іменами глав та двома іншими назвами includeта lib. Ті, хто має назви глав, містять усі програми цієї глави.

includeКаталог містить файл заголовка , який використовується в більшості програм в книзі: apue.h. У libкаталозі є вихідний код реалізацій для цього заголовка.

Припустимо, що нестиснений файл знаходиться за адресою: SCADDRESS/наприклад, це може бути: /home/yourid/Downloads/apue.3e/

Після розпакування вихідного коду зайдіть у каталог і запустіть make:

$ cd SCADDRESS
$ make

makeскладе всі програми у всіх розділах. Але важливо те, що до цього він зробить бібліотеку, яка буде містити реалізацію функцій в apue.h.

Щоб скласти приклад програми, яку ви пишете з книги, запустіть цю команду GCC (припустимо, що назва вашої програми myls.cє першим у книзі):

gcc -o myls myls.c -I SCADDRESS/include/ -L SCADDRESS/lib/ -lapue

-Iповідомляє, в gccякому каталозі шукати файл включення. -Lповідомляє йому про розташування каталогу бібліотеки та -lapueповідомляє ім'я файлу бібліотеки, який потрібно шукати в цьому каталозі. Такий, що -LXXX означає шукати файл у каталозі бібліотеки з іменем: libXXX.a або libXXX.so.


Іноді це може бути просвітливо додати -Wallдо gccкоманди, щоб зробити це попередження частіше.
MattBianco

3

Я думаю, що цей запит на stackoverflow під назвою: Де визначена функція err_sys ()? має те, що вам потрібно. З 2 відповідей у ​​цій темі було сказано:

А1

err_sys () - функція, що використовується в кількох книгах, написаних У. Річардом Стівенсом. Ця функція використовується для друку типу помилки.

Функція використовується в програмах у текстах із користувацьким файлом заголовка "ourhdr.h" (або ще чимось). Перевірте додаток до списку заголовків або визначення функції.

А2

Джерело цієї функції (з розширеного програмування в середовищі UNIX®, У. Річард Стівенс) можна знайти на веб-сайті книги: http://www.apuebook.com/ .

Список літератури


Дякую, але моя проблема полягає в тому, як його скласти, щоб ці помилки не виникали. Це err_sysлише приклад, у цьому файлі заголовка є інші функції. Тому я шукаю загальну відповідь на цю проблему (як включити файл заголовка та успішно його скласти), не переписуючи цю конкретну функцію.
makhlaghi

1
@makhlaghi - помилки є чистими, вам не вистачає базових реалізацій. Зазвичай ви включаєте ці w / gccвикористовуючи -Lаргументи, що посилаються на бібліотеки, які слід використовувати. Бібліотеки - це .soабо .aфайли. Цей підручник може бути корисним для ознайомлення з w / gcc, ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html . Зокрема цей розділ: "Пошук файлів і бібліотек заголовків (-I, -L і -l)"
slm

Велике спасибі за терпіння у спілкуванні зі мною (бути недосвідченим!). Я зрозумів, як це скласти. Я повинен використовувати цю команду: gcc -o myls myls.c -L LIBPOSITION -lapue. Де LIBPOSITION знаходиться в libкаталозі нестисненого каталогу. Знову дякую.
makhlaghi

@makhlaghi - не згадуй про це. Мені подобається допомагати іншим зрозуміти, як все працює. Вірите чи ні, пояснюючи речі, це допомагає і мені зрозуміти речі краще. Дякуємо за Q та удачу з вами в дорозі!
slm

2

Наступні кроки працювали для мене (Ubuntu 14.04 64bit):

  1. wget http://www.apuebook.com/src.3e.tar.gzЗавантажте архів gzipped tar з офіційного сайту книги
  2. tar xzf src.3e.tar.gzЦе створює розпаковану папку, яку називають apue.3eу поточному каталозі за замовчуванням
  3. cd apue.3e
  4. sudo apt-get install libbsd-dev. Це для посилання -lbsd в / потоках
  5. make Це автоматично скомпілює весь вихідний код у всіх папках
  6. cd introпотім ./ls1 ..працює як очікувалося (перераховує файли з батьківського каталогу)

Можливо, вам доведеться позіхати, щоб знайти інші фрагменти коду з книги, але це повинно бути прямим.


1

Що пояснив Махлігі в своєму останньому коментарі, працював на мене, але мені довелося використовувати інший вихідний код, а не той, який офіційний веб-сайт www.apuebook.com.

Те, що я використав, можна знайти на https://github.com/roktas/apue2e . Як пояснив хтось, цей варіант був реалізований для роботи із сучасною системою Linux.


Можливо, ви могли б це трохи розробити?
slm

0

Я успішно побудував бібліотеку за допомогою наведеної тут інструкції командного рядка. У мене виникли труднощі зі складанням зразка в Xcode. Для цього я визначив шляхи пошуку файлів заголовків та бібліотек (панель "Налаштування параметрів"). Чим я визначив саму бібліотеку на панелі "Фази збірки", ніж "Пов’язати бінарне з бібліотеками". Після цього - вітер.


0

Якщо встановлено apue.3e , ви можете спробувати помістити apue в каталог за замовчуванням, наприклад:

code@lab:~/src/code$ sudo cp ../apue.3e/include/apue.h /usr/include/
code@lab:~/src/code$ sudo cp ../apue.3e/lib/libapue.a /usr/lib/

Коли код складається, будь ласка, додайте аргумент: -lapue

code@lab:~/src/code$ gcc -o myls myls.c -lapue
code@lab:~/src/code$ ./myls
Usage: ls <dir>

0

'err_sys' та 'err_quit' присутні у файлі під назвою 'errno.c', який відсутній у вашому поточному робочому каталозі. Перш за все, відкрийте завантажену та нестиснену папку "apue" та скопіюйте всі елементи в цій папці, наприклад, advio, демон та ін., Все у поточний робочий каталог. Ви можете знати свій поточний робочий каталог за за допомогою команди "pwd". Тепер у папці "включити" ви знайдете файл заголовка apue. Скопіюйте це також у свою поточну робочу директорію. У двох словах, будь-який файл .c, який ви збираєтеся використовувати у вашій програмі, повинен знаходитись у вашому поточному робочому каталозі. Отже, скопіюйте всі ці файли у поточну робочу директорію.

Тепер для вирішення вашої проблеми. Файл errno.c знаходиться в папці lib у папці apue. Скопіюйте це у свій поточний робочий каталог. Це вирішить вашу проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.