Kompilasi kode dari apue


12

Baru saja saya mulai membaca buku: Pemrograman Tingkat Lanjut di Lingkungan UNIX® . Saya ingin mencoba menjalankan contoh kode pertamanya. Saya menjalankan Scientific Linux 6.4.

Saya mengunduh kode sumber dan seperti yang tertulis dalam README-nya, saya berlari makedi file yang tidak dikompresi.

Saya menulis program pertama ( lsperintah mock )

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

dan letakkan di file yang tidak dikompresi. Sebagai buku telah menyarankan Saya kemudian berlari: gcc myls.c. Tapi saya mendapatkan kesalahan ini:

# 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

Saya ingin tahu bagaimana saya bisa memperbaiki masalah ini. Saya juga ingin dapat menjalankan kode yang saya tulis di direktori mana pun.


Dari mana Anda harapkan err_{quit,sys}?
Chris Down

Dalam kode sumber terkompresi, ada direktori:, includeyang memiliki file header apue.h. Tetapi ini adalah satu-satunya file dalam direktori itu. Saya tidak mengerti di mana definisi fungsi sebenarnya berada! Saya pikir seseorang mungkin akrab dengan struktur file kode sumber buku ini di sini.
makhlaghi

.hFile - file termasuk prototipe untuk fungsi-fungsi. Implementasinya ada di dalam .soatau .afile yang perlu ada di kotak. Ini adalah perpustakaan dinamis & statis yang berisi fungsi.
slm

Apa itu apue.h?
Suara

Jawaban:


13

Tinjauan singkat tentang cara menulis dan mengkompilasi program dalam Pemrograman Tingkat Lanjut di Lingkungan UNIX® , terima kasih kepada slm karena membantu saya memahami langkah-langkahnya. Anda dapat mengunduh kode sumber dari sini . Saya berharap informasi ini dimasukkan sebagai bagian dari lampiran b buku ini, di mana file header dijelaskan.

File yang tidak dikompres berisi direktori dengan nama bab dan dua lainnya bernama includedan lib. Orang-orang dengan nama bab memiliki semua program bab itu di dalamnya.

The includedirektori berisi file header yang digunakan di sebagian besar program dalam buku ini: apue.h. The libdirektori memiliki kode sumber dari implementasi untuk header itu.

Mari kita asumsikan file yang tidak terkompresi ini berada di SCADDRESS/:, misalnya mungkin: /home/yourid/Downloads/apue.3e/

Setelah Anda mengompres kode sumber, masuk ke direktori dan jalankan make:

$ cd SCADDRESS
$ make

makeakan mengkompilasi semua program di semua bab. Tetapi yang penting adalah bahwa sebelum itu, itu akan membuat perpustakaan yang berisi implementasi dari fungsi di apue.h.

Untuk mengkompilasi contoh program yang Anda tulis dari buku, jalankan perintah GCC ini (dengan asumsi nama program Anda adalah myls.cyang pertama dalam buku):

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

-Imemberitahu gccdirektori mana untuk mencari file include. -Lmemberi tahu lokasi direktori perpustakaan, dan -lapue, memberi tahu nama file perpustakaan yang harus dicari di direktori itu. Sehingga -LXXX berarti mencari file di direktori library dengan nama: libXXX.a atau libXXX.so.


Ini kadang-kadang dapat mencerahkan untuk menambahkan -Wallke gccperintah untuk membuatnya memperingatkan lebih sering.
MattBianco

3

Saya pikir stackoverflow ini T&J berjudul: Di mana fungsi err_sys () didefinisikan? memiliki apa yang Anda butuhkan. 2 dari jawaban di utas ini mengatakan:

A1

err_sys () adalah fungsi yang digunakan dalam beberapa buku yang ditulis oleh W. Richard Stevens. Fungsi ini digunakan untuk mencetak jenis kesalahan apa yang terjadi.

Fungsi ini digunakan dalam program dalam teks dengan file header khusus "ourhdr.h" (atau yang lainnya). Periksa lampiran untuk daftar tajuk atau definisi fungsi.

A2

Sumber untuk fungsi ini (dari Pemrograman Tingkat Lanjut di Lingkungan UNIX®, oleh W. Richard Stevens) dapat ditemukan di situs web buku ini: http://www.apuebook.com/ .

Referensi


Terima kasih, tetapi masalah saya adalah bagaimana mengompilasinya, jadi kesalahan ini tidak muncul. Ini err_syshanyalah sebuah contoh, ada fungsi lain di file header itu. Jadi saya mencari jawaban umum untuk masalah ini (bagaimana memasukkan file header dan berhasil mengompilasinya), bukan menulis ulang fungsi khusus ini.
makhlaghi

1
@makhlaghi - kesalahannya adalah b / c Anda melewatkan implementasi yang mendasarinya. Anda biasanya menyertakan ini gccdengan menggunakan -Largumen yang merujuk perpustakaan untuk digunakan. Perpustakaan adalah file .soatau .a. Tutorial ini mungkin membantu dalam berkenalan dengan w / gcc, ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html . Khususnya bagian ini: "Mencari File Header dan Perpustakaan (-I, -L dan -l)"
slm

Terima kasih banyak atas kesabaran Anda dalam berurusan dengan saya (tidak berpengalaman!). Saya mengerti bagaimana cara mengkompilasinya. Saya harus menggunakan perintah ini: gcc -o myls myls.c -L LIBPOSITION -lapue. Di mana LIBPOSISI berada dalam libdirektori direktori yang tidak terkompresi. Terima kasih lagi.
makhlaghi

@makhlaghi - jangan sebutkan itu. Saya suka membantu orang lain memahami cara kerja. Percaya atau tidak, dengan harus menjelaskan hal-hal itu membantu saya untuk memahami hal-hal yang lebih baik juga. Terima kasih untuk Q dan semoga berhasil bersama Anda!
slm

2

Langkah-langkah berikut ini berhasil bagi saya (Ubuntu 14.04 64bit):

  1. wget http://www.apuebook.com/src.3e.tar.gzUnduh arsip tar yang di-gzip dari situs buku resmi
  2. tar xzf src.3e.tar.gzIni menciptakan folder unzipped yang disebut di apue.3ebawah direktori saat ini secara default
  3. cd apue.3e
  4. sudo apt-get install libbsd-dev. Ini untuk tautan -lbsd di / utas
  5. make Ini secara otomatis akan mengkompilasi semua kode sumber di semua folder
  6. cd introkemudian ./ls1 ..berfungsi seperti yang diharapkan (daftar file dari direktori induk)

Anda mungkin harus mencari sekitar untuk menemukan potongan kode lain dari buku tetapi harus langsung.


1

Apa yang dijelaskan makhlighi dalam komentar terakhirnya berhasil untuk saya, tetapi saya harus menggunakan kode sumber yang berbeda bukan yang dari situs web resmi www.apuebook.com.

Yang saya gunakan dapat ditemukan di https://github.com/roktas/apue2e . Seperti yang dijelaskan seseorang, ini telah diterapkan untuk bekerja dengan sistem Linux modern.


Mungkin Anda bisa menguraikannya sedikit?
slm

0

Saya telah berhasil membangun perpustakaan menggunakan instruksi baris perintah yang diberikan di sini. Saya mengalami kesulitan untuk membangun sampel dalam Xcode. Untuk menyelesaikannya, saya telah menetapkan jalur pencarian untuk file header dan perpustakaan (panel "Bangun Pengaturan"). Daripada saya telah mendefinisikan perpustakaan itu sendiri di panel "Bangun Fase" dari panel "Tautan Biner Dengan Perpustakaan". Setelah itu, sangat mudah.


0

Jika apue.3e diinstal, Anda dapat mencoba memasukkan apue ke direktori default os, mis:

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/

Saat kode dikompilasi, tambahkan argumen: -lapue

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

0

'err_sys' dan 'err_quit' ada dalam file bernama 'errno.c' yang tidak ada di direktori kerja Anda saat ini. Pertama-tama, buka folder 'apue' yang telah Anda unduh dan tidak terkompresi dan salin semua item dalam folder itu, misalnya, advio, daemon, dll., Semuanya ke direktori kerja Anda saat ini. Anda dapat mengetahui direktori kerja Anda saat ini dengan menggunakan perintah 'pwd'. Sekarang, di folder 'include' Anda akan menemukan file header apue. Salin juga ke direktori kerja Anda saat ini. Singkatnya, semua file .c yang akan Anda gunakan dalam program Anda harus berada di direktori kerja Anda saat ini. Jadi, salin semua file itu ke direktori kerja Anda saat ini.

Sekarang, untuk menyelesaikan masalah Anda. File errno.c ada di folder lib di folder apue. Salin itu ke direktori kerja Anda saat ini. Itu akan menyelesaikan masalah Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.