Компиляция кода из 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. Но это единственный файл в этом каталоге. Я не понимаю, где реальные определения функций! Я думал, что кто-то может быть знаком со структурой файла исходного кода этой книги здесь.
Махлаги

В .hфайлах включают protypes для функций. Их реализация в .soили .aфайлах , которые должны присутствовать на коробке. Это динамические и статические библиотеки, которые содержат функции.
SLM

Что ещё есть apue.h?
голоса

Ответы:


13

Краткий обзор того, как писать и компилировать программы в Advanced Programming в среде 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

Я думаю, что вопросы и ответы о стековом потоке под названием: Где определена функция err_sys ()? есть то, что вам нужно. 2 из ответов в этой теме говорили следующее:

A1

err_sys () - это функция, используемая в нескольких книгах, написанных У. Ричардом Стивенсом. Эта функция используется для печати, какой тип ошибки произошел.

Функция используется в программах в текстах с настраиваемым заголовочным файлом «ourhdr.h» (или чем-то еще). Проверьте приложение для списка заголовка или определения функции.

A2

Источник этой функции (из книги «Расширенное программирование в среде UNIX®» У. Ричарда Стивенса) можно найти на веб-сайте книги: http://www.apuebook.com/ .

Ссылки


Спасибо, но моя проблема в том, как его скомпилировать, чтобы эти ошибки не появлялись. Это err_sysпросто пример, в этом заголовочном файле есть другие функции. Поэтому я ищу общий ответ на эту проблему (как включить файл заголовка и успешно скомпилировать его), а не переписывать эту конкретную функцию.
Махлаги

1
@makhlaghi - ошибки, потому что вы упускаете базовые реализации. Вы обычно включаете эти аргументы gccс использованием -Lссылок на используемые библиотеки. Библиотеки .soили .aфайлы. Этот учебник может быть полезен в ознакомлении ж / 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 - не упоминай об этом. Мне нравится помогать другим понимать, как все работает. Хотите верьте, хотите нет, но объясняя вещи, это помогает мне лучше понимать вещи. Спасибо за Q и удачи в пути!
SLM

2

Следующие шаги сработали для меня (Ubuntu 14.04 64bit):

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

Возможно, вам придется поискать другие фрагменты кода из книги, но это должно быть просто.


1

То, что Махлиги объяснил в своем последнем комментарии, сработало для меня, но мне пришлось использовать другой исходный код, а не тот, что на официальном сайте www.apuebook.com.

Тот, который я использовал, можно найти по адресу https://github.com/roktas/apue2e . Как кто-то объяснил, это было реализовано для работы с современной системой Linux.


Возможно, вы могли бы уточнить это немного?
SLM

0

Я успешно построил библиотеку, используя приведенную здесь инструкцию командной строки. У меня были трудности с созданием образца в Xcode. Для этого я определил пути поиска для файлов заголовков и библиотек (панель «Настройки сборки»). Чем я определил саму библиотеку на «Фазах сборки», чем «Связать двоичные файлы с библиотеками». После этого это ветер.


0

Если установлен apue.3e , вы можете попробовать поместить apue в каталог os default, например:

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, daemons и т. Д., Все в свой текущий рабочий каталог. Вы можете узнать свой текущий рабочий каталог по используя команду «pwd». Теперь в папке «include» вы найдете заголовочный файл apue. Скопируйте его также в текущую рабочую директорию. В двух словах, любой файл .c, который вы собираетесь использовать в своей программе, должен находиться в вашем текущем рабочем каталоге. Итак, скопируйте все эти файлы в ваш текущий рабочий каталог.

Теперь для решения вашей проблемы. Файл errno.c находится в папке lib в папке apue. Скопируйте его в свой текущий рабочий каталог. Это решит вашу проблему.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.