Apue'den kod derleme


12

Şimdi şu kitabı okumaya başladım: UNIX® Ortamında İleri Programlama . İlk kod örneğini çalıştırmayı denemek istedim. Scientific Linux 6.4 kullanıyorum.

Ben indirilen kaynak kodu ve onun README söylediği gibi, Koştum makesıkıştırılmamış dosya.

İlk programı yazdım (sahte bir lskomut)

#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;
}

ve sıkıştırılmamış dosyaya koyun. Kitap tavsiye ettiği gibi Sonra koştum: gcc myls.c. Ama bu hatayı alıyorum:

# 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

Bu sorunu nasıl çözebileceğimi bilmek istedim. Ayrıca herhangi bir dizine yazdığım bir kodu çalıştırmak istiyorum.


Nereden err_{quit,sys}gelmeyi umuyorsun?
Chris Down

Sıkıştırılmamış kaynak kodunda, includebaşlık dosyasına sahip bir dizin: vardır apue.h. Ancak bu dizindeki tek dosya budur. Gerçek fonksiyon tanımlarının nerede olduğunu anlamıyorum! Birisinin bu kitabın kaynak kod dosyası yapısına aşina olabileceğini düşündüm.
13'te

.hDosyalar fonksiyonları için protypes sayılabilir. Onların uygulamaları .soya .ada kutuda bulunması gereken dosyalar. Bunlar işlevleri içeren dinamik ve statik kütüphanelerdir.
slm

Hatta ne var apue.h?
sesler

Yanıtlar:


13

Adımları anlamama yardımcı olan slm sayesinde UNIX® Ortamında Gelişmiş Programlama'daki programların nasıl yazılacağı ve derleneceğine dair kısa bir inceleme . Sen kaynak kodunu indirebilirsiniz buradan . Bu bilginin başlık dosyasının açıklandığı kitabın ek b'nin bir parçası olarak dahil edilmesini dilerim.

Sıkıştırılmamış dosya bölümlerin isimleri ve adında iki başkalarıyla dizinleri içerir includeve lib. Bölümlerin isimleri olanlar o bölümdeki tüm programlara sahiptir.

includeDizin kitapta programlarının çoğunda kullanılan başlık dosyasını içerir: apue.h. libDizin, başlık için uygulamaların kaynak kodu vardır.

Sıkıştırılmamış dosyanın şu konumda olduğunu varsayalım: SCADDRESS/örneğin: /home/yourid/Downloads/apue.3e/

Kaynak kodu açtıktan sonra dizine girin ve çalıştırın make:

$ cd SCADDRESS
$ make

makebölümlerdeki tüm programları derleyecektir. Ama önemli olan, bundan önce, içindeki işlevlerin uygulanmasını içeren kütüphaneyi yapmasıdır apue.h.

Kitaptan yazdığınız bir örnek programı derlemek için, bu GCC komutunu çalıştırın (programınızın adının myls.ckitapta ilk ad olduğunu varsayarak ):

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

-Igcciçerme dosyasını hangi dizinde arayacağını söyler . -Lona kütüphane dizininin yerini -lapuesöyler ve kütüphane dosyasının adını bu dizinde aranmasını söyler. Öyle ki -LXXX, kütüphane dizininde libXXX.a veya libXXX.so adında bir dosya aramak anlamına gelir.


Bazen eklemek aydınlatarak olabilir -Walliçin gccdaha sık uyarmak yapmak komuta.
MattBianco

3

Sanırım bu stackoverflow Q & A başlıklı: err_sys () işlevi nerede tanımlanır? ihtiyacınız olan şey var. Bu konudaki cevapların 2'sinde şunlar vardı:

A1

err_sys (), W. Richard Stevens tarafından yazılmış birçok kitapta kullanılan bir fonksiyondur. Bu işlev, ne tür bir hatanın meydana geldiğini yazdırmak için kullanılır.

İşlev metinlerdeki programlarda özel başlık dosyası "ourhdr.h" (veya başka bir şey) bulunan programlarda kullanılır. Başlık listesi veya işlev tanımı için eke bakın.

A2

Bu işlevin kaynağı (UNIX® Ortamında İleri Programlama'dan, W. Richard Stevens tarafından) kitabın web sitesinde bulunabilir: http://www.apuebook.com/ .

Referanslar


Teşekkürler, ama benim sorunum nasıl derleneceğidir, bu yüzden bu hatalar ortaya çıkmaz. Bu err_syssadece bir örnektir, bu başlık dosyasında başka işlevler de vardır. Bu nedenle, bu özel işlevin yeniden yazılması değil, başlık dosyasına nasıl eklenir ve başarıyla derlenirse bu soruna genel bir yanıt arıyorum.
13'te

1
@makhlaghi - hatalar, temeldeki uygulamaları kaçırdığınız b / c'dir. Bu w / gccusing -Largümanlarını, kullanılacak kitaplıkları referans alan argümanlara dahil edersiniz . Kütüphaneler .soveya .adosyalarıdır. Bu eğitim gcc, ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html ile tanışmakta yardımcı olabilir . Özellikle bu bölüm: "Başlık Dosyalarını ve Kütüphanelerini Arama (-I, -L ve -l)"
slm

Benimle uğraştığınız için teşekkür ederiz (deneyimsiz olmak!). Nasıl derleyeceğimi anladım. Ben bu komutu kullanmak zorunda: gcc -o myls myls.c -L LIBPOSITION -lapue. Burada LIBPOSITION libsıkıştırılmamış dizinin dizinindedir. Tekrar teşekkürler.
13'te

@makhlaghi - bundan bahsetme. Başkalarının işlerin nasıl yürüdüğünü anlamasına yardımcı olmayı seviyorum. İster inanın ister inanmayın, bir şeyleri açıklamak zorunda kaldığımda, işleri daha iyi anlamama yardımcı olur. Q için teşekkürler ve w / gcc yolculuk iyi şanslar!
slm

2

Aşağıdaki adımlar benim için çalıştı (Ubuntu 14.04 64bit):

  1. wget http://www.apuebook.com/src.3e.tar.gzResmi kitap sitesinden sıkıştırılmış tar arşivini indirin
  2. tar xzf src.3e.tar.gzBu, apue.3evarsayılan olarak geçerli dizin altında çağrılan sıkıştırılmamış klasörü oluşturur
  3. cd apue.3e
  4. sudo apt-get install libbsd-dev. Bu, / thread içindeki -lbsd bağlantısı içindir
  5. make Bu otomatik olarak tüm klasörlerdeki tüm kaynak kodlarını derleyecektir
  6. cd introsonra ./ls1 ..beklendiği gibi çalışır (üst dizindeki dosyaları listeler)

Kitaptan başka kod parçacıkları bulmak için etrafta dolaşmanız gerekebilir, ancak basit olmalıdır.


1

Makhlighi'nin son yorumunda açıkladığı şey benim için çalıştı ama resmi web sitesinden www.apuebook.com'dan değil farklı kaynak kodu kullanmak zorunda kaldım.

Kullandığım https://github.com/roktas/apue2e adresinde bulunabilir . Birisinin açıkladığı gibi, bu modern Linux sistemi ile çalışmak için uygulandı.


Belki bunu biraz ayrıntılandırabilirsin?
slm

0

Burada verilen komut satırı talimatını kullanarak kütüphaneyi başarıyla oluşturdum. Xcode'da bir örnek oluşturmakta zorlandım. Bunu yapmak için, üstbilgi dosyaları ve kütüphaneler ("Oluşturma ayarları" bölmesi) için arama yolları tanımladım. Daha sonra kütüphaneyi "İnşa Etme Aşamaları" nda "İkili Kütüphanelere Bağla" bölmesinden tanımladım. Bundan sonra, bir esinti.


0

Eğer apue.3e yüklüyse, os varsayılan dizine, eski haline APUE koymak için deneyebilirsiniz:

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/

Kod derlendiğinde, lütfen argümanı ekleyin: -lapue

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

0

'err_sys' ve 'err_quit', geçerli çalışma dizininizde bulunmayan 'errno.c' adlı bir dosyada bulunur. Her şeyden önce, indirip açtığınız 'apue' klasörünü açın ve o klasördeki tüm öğeleri (örneğin advio, daemons vb.) Mevcut çalışma dizininize kopyalayın. 'pwd' komutunu kullanarak. 'include' klasöründe apue.Copy başlık dosyasını da mevcut çalışma dizininizde bulacaksınız. Özetle, programınızda kullanacağınız herhangi bir .c dosyası Bu nedenle, tüm bu dosyaları geçerli çalışma dizininize kopyalayın.

Şimdi, sorununuzu çözmek için. Errno.c dosyası apue klasöründeki lib klasöründedir. Mevcut çalışma dizininize kopyalayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.