Только сейчас я начал читать книгу: Расширенное программирование в среде 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
файлах , которые должны присутствовать на коробке. Это динамические и статические библиотеки, которые содержат функции.apue.h
?Ответы:
Краткий обзор того, как писать и компилировать программы в Advanced Programming в среде UNIX® , благодаря slm за помощь в понимании шагов. Вы можете скачать исходный код здесь . Хотелось бы, чтобы эта информация была включена как часть приложения b к книге, где объясняется заголовочный файл.
Несжатый файл содержит каталоги с именами глав и двумя другими именами
include
иlib
. Те, у кого есть названия глав, содержат в себе все программы этой главы.include
Каталог содержит файл заголовка , который используется в большинстве программ в книге:apue.h
. Вlib
каталоге есть исходный код реализаций для этого заголовка.Предположим, что несжатый файл находится по адресу:
SCADDRESS/
например, это может быть:/home/yourid/Downloads/apue.3e/
Как только вы распакуете исходный код, зайдите в каталог и запустите
make
:make
скомпилирует все программы во всех главах. Но важно то, что перед этим он создаст библиотеку, которая будет содержать реализации функций вapue.h
.Чтобы скомпилировать пример программы, которую вы пишете из книги, выполните команду GCC (при условии, что имя вашей программы
myls.c
- первое в книге):-I
говорит, вgcc
каком каталоге искать включаемый файл.-L
сообщает ему местоположение каталога библиотеки и-lapue
сообщает имя файла библиотеки для поиска в этом каталоге. Такое, что -LXXX означает поиск файла в каталоге библиотеки с именем: libXXX.a или libXXX.so.источник
-Wall
кgcc
команде , чтобы сделать его предупредить чаще.Я думаю, что вопросы и ответы о стековом потоке под названием: Где определена функция err_sys ()? есть то, что вам нужно. 2 из ответов в этой теме говорили следующее:
A1
A2
Ссылки
источник
err_sys
просто пример, в этом заголовочном файле есть другие функции. Поэтому я ищу общий ответ на эту проблему (как включить файл заголовка и успешно скомпилировать его), а не переписывать эту конкретную функцию.gcc
с использованием-L
ссылок на используемые библиотеки. Библиотеки.so
или.a
файлы. Этот учебник может быть полезен в ознакомлении ж /gcc
, ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html . В частности, этот раздел: «Поиск заголовочных файлов и библиотек (-I, -L и -l)»gcc -o myls myls.c -L LIBPOSITION -lapue
. Где LIBPOSITION находится вlib
каталоге несжатого каталога. Еще раз спасибо.Следующие шаги сработали для меня (Ubuntu 14.04 64bit):
wget http://www.apuebook.com/src.3e.tar.gz
Скачайте архив с архивом tar с официального сайта книгиtar xzf src.3e.tar.gz
Это создает распакованную папкуapue.3e
по умолчанию в текущем каталогеcd apue.3e
sudo apt-get install libbsd-dev
, Это по ссылке -lbsd в / threadsmake
Это автоматически скомпилирует весь исходный код во всех папкахcd intro
затем./ls1 ..
работает как положено (выводит список файлов из родительского каталога)Возможно, вам придется поискать другие фрагменты кода из книги, но это должно быть просто.
источник
То, что Махлиги объяснил в своем последнем комментарии, сработало для меня, но мне пришлось использовать другой исходный код, а не тот, что на официальном сайте www.apuebook.com.
Тот, который я использовал, можно найти по адресу https://github.com/roktas/apue2e . Как кто-то объяснил, это было реализовано для работы с современной системой Linux.
источник
Я успешно построил библиотеку, используя приведенную здесь инструкцию командной строки. У меня были трудности с созданием образца в Xcode. Для этого я определил пути поиска для файлов заголовков и библиотек (панель «Настройки сборки»). Чем я определил саму библиотеку на «Фазах сборки», чем «Связать двоичные файлы с библиотеками». После этого это ветер.
источник
Если установлен apue.3e , вы можете попробовать поместить apue в каталог os default, например:
Когда код скомпилирован, добавьте аргумент:
-lapue
источник
'err_sys' и 'err_quit' присутствуют в файле с именем 'errno.c', которого нет в вашем текущем рабочем каталоге. Прежде всего, откройте папку «apue», которую вы скачали и распаковали, и скопируйте все элементы в этой папке, например, advio, daemons и т. Д., Все в свой текущий рабочий каталог. Вы можете узнать свой текущий рабочий каталог по используя команду «pwd». Теперь в папке «include» вы найдете заголовочный файл apue. Скопируйте его также в текущую рабочую директорию. В двух словах, любой файл .c, который вы собираетесь использовать в своей программе, должен находиться в вашем текущем рабочем каталоге. Итак, скопируйте все эти файлы в ваш текущий рабочий каталог.
Теперь для решения вашей проблемы. Файл errno.c находится в папке lib в папке apue. Скопируйте его в свой текущий рабочий каталог. Это решит вашу проблему.
источник