Biên dịch mã từ apue


12

Ngay bây giờ tôi đã bắt đầu đọc cuốn sách: Lập trình nâng cao trong môi trường UNIX® . Tôi muốn thử chạy ví dụ mã đầu tiên của nó. Tôi đang chạy Khoa học Linux 6.4.

Tôi đã tải xuống mã nguồn và như đã nói trong README của nó, tôi đã chạy maketrong tệp không nén.

Tôi đã viết chương trình đầu tiên (một lslệnh giả )

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

và đặt nó trong tập tin không nén. Như cuốn sách đã khuyên tôi nên chạy : gcc myls.c. Nhưng tôi nhận được lỗi này:

# 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

Tôi muốn biết làm thế nào tôi có thể khắc phục vấn đề này. Tôi cũng muốn có thể chạy một mã tôi viết trong bất kỳ thư mục nào.


Bạn mong đợi err_{quit,sys}đến từ đâu?
Chris Xuống

Trong mã nguồn không nén, có một thư mục : include, có tệp tiêu đề apue.h. Nhưng đây là tập tin duy nhất trong thư mục đó. Tôi không hiểu định nghĩa hàm thực tế ở đâu! Tôi nghĩ ai đó có thể quen thuộc với cấu trúc tệp mã nguồn của cuốn sách này ở đây.
makhlaghi 17/12/13

Các .htập tin bao gồm các protypes cho các chức năng. Việc triển khai của họ là trong .sohoặc .acác tập tin cần phải có trên hộp. Đây là những thư viện động & tĩnh chứa các hàm.
slm

Thậm chí là apue.hgì?
lên tiếng vào

Câu trả lời:


13

Một đánh giá ngắn về cách viết và biên dịch các chương trình trong Lập trình nâng cao trong Môi trường UNIX® , nhờ slm đã giúp tôi hiểu các bước. Bạn có thể tải về mã nguồn từ đây . Tôi muốn thông tin này được đưa vào như một phần của phụ lục b của cuốn sách, nơi tập tin tiêu đề được giải thích.

Tệp không nén chứa các thư mục có tên của các chương và hai tệp khác có tên includelib. Những cái có tên của các chương có tất cả các chương trình của chương đó trong đó.

Thư mục includechứa tệp tiêu đề được sử dụng trong hầu hết các chương trình trong sách : apue.h. Thư mục libcó mã nguồn của các triển khai cho tiêu đề đó.

Giả sử tệp không nén được đặt tại : SCADDRESS/, ví dụ: nó có thể là: /home/yourid/Downloads/apue.3e/

Khi bạn giải nén mã nguồn, hãy vào thư mục và chạy make:

$ cd SCADDRESS
$ make

makesẽ biên dịch tất cả các chương trình trong tất cả các chương. Nhưng điều quan trọng là trước đó, nó sẽ làm cho thư viện sẽ chứa các cài đặt của các hàm trong apue.h.

Để biên dịch một chương trình ví dụ mà bạn viết từ sách, hãy chạy lệnh GCC này (giả sử tên chương trình của bạn là tên myls.cđầu tiên trong sách):

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

-Icho biết gccthư mục nào cần tìm tập tin bao gồm. -Lcho nó biết vị trí của thư mục thư viện, và -lapue, cho biết tên của tệp thư viện cần tìm trong thư mục đó. Như vậy -LXXX có nghĩa là tìm kiếm một tệp trong thư mục thư viện với tên: libXXX.a hoặc libXXX.so.


Đôi khi nó có thể được khai sáng để thêm -Wallvào gcclệnh để làm cho nó cảnh báo thường xuyên hơn.
MattBianco

3

Tôi nghĩ Q & A stackoverflow này có tiêu đề: Hàm err_sys () được định nghĩa ở đâu? có những gì bạn cần. 2 trong số các câu trả lời trong chủ đề đó có điều này để nói:

A1

err_sys () là một hàm được sử dụng trong một số cuốn sách được viết bởi W. Richard Stevens. Chức năng này được sử dụng để in loại lỗi xảy ra.

Hàm này được sử dụng trong các chương trình trong các văn bản với tệp tiêu đề tùy chỉnh "ourhdr.h" (hoặc một cái gì đó khác). Kiểm tra phụ lục cho danh sách tiêu đề hoặc định nghĩa chức năng.

A2

Nguồn cho chức năng này (từ Lập trình nâng cao trong Môi trường UNIX®, của W. Richard Stevens) có thể được tìm thấy trên trang web của cuốn sách: http://www.apuebook.com/ .

Người giới thiệu


Cảm ơn, nhưng vấn đề của tôi là làm thế nào để biên dịch nó, vì vậy những lỗi này không xuất hiện. Đây err_syschỉ là một ví dụ, có các chức năng khác trong tệp tiêu đề đó. Vì vậy, tôi đang tìm kiếm một câu trả lời chung cho vấn đề này (làm thế nào để bao gồm tệp tiêu đề và biên dịch thành công nó), không viết lại chức năng cụ thể này.
makhlaghi 17/12/13

1
@makhlaghi - lỗi là do bạn đang thiếu các triển khai cơ bản. Bạn thường bao gồm những w / gccsử dụng -Lđối số tham chiếu các thư viện để sử dụng. Các thư viện là .sohoặc .atập tin. Hướng dẫn này có thể hữu ích trong việc làm quen với w / gcc, ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html . Cụ thể phần này: "Đang tìm kiếm các header Files and Libraries (-I, -L và -l)"
SLM

Cảm ơn rất nhiều vì sự kiên nhẫn của bạn trong việc đối phó với tôi (thiếu kinh nghiệm!). Tôi hiểu làm thế nào để biên dịch nó. Tôi phải sử dụng lệnh này: gcc -o myls myls.c -L LIBPOSITION -lapue. Trong đó LIBPOSITION nằm trong libthư mục của thư mục không nén. Cảm ơn một lần nữa.
makhlaghi

@makhlaghi - đừng nhắc đến nó. Tôi thích giúp đỡ người khác hiểu cách mọi thứ hoạt động. Tin hay không, bằng cách phải giải thích những điều nó cũng giúp tôi hiểu mọi thứ tốt hơn. Cảm ơn Q và chúc may mắn với hành trình gcc của bạn!
slm

2

Các bước sau đây đã giúp tôi (Ubuntu 14.04 64 bit):

  1. wget http://www.apuebook.com/src.3e.tar.gzTải về kho lưu trữ tar được nén từ trang sách chính thức
  2. tar xzf src.3e.tar.gzĐiều này tạo thư mục giải nén được gọi apue.3etheo thư mục hiện tại theo mặc định
  3. cd apue.3e
  4. sudo apt-get install libbsd-dev. Đây là liên kết -lbsd trong / chủ đề
  5. make Điều này sẽ tự động biên dịch tất cả các mã nguồn trong tất cả các thư mục
  6. cd introsau đó ./ls1 ..hoạt động như mong đợi (liệt kê các tệp từ thư mục cha)

Bạn có thể phải đi loanh quanh để tìm các đoạn mã khác từ cuốn sách nhưng nó rất đơn giản.


1

Những gì makhlighi đã giải thích trong bình luận cuối cùng của anh ấy đã làm việc cho tôi nhưng tôi đã phải sử dụng mã nguồn khác nhau chứ không phải mã từ trang web chính thức www.apuebook.com.

Cái tôi đã sử dụng có thể được tìm thấy trong https://github.com/roktas/apue2e . Như ai đó đã giải thích, cái này đã được thực hiện để làm việc với hệ thống Linux hiện đại.


Có lẽ bạn có thể giải thích điều này một chút?
slm

0

Tôi đã xây dựng thành công thư viện bằng cách sử dụng hướng dẫn dòng lệnh được đưa ra ở đây. Tôi đã gặp khó khăn khi xây dựng một mẫu trong Xcode. Để hoàn thành nó, tôi đã xác định đường dẫn tìm kiếm cho các tệp tiêu đề và thư viện (khung "Cài đặt bản dựng"). Hơn tôi đã định nghĩa chính thư viện trong khung "Xây dựng giai đoạn" thay vì ngăn "Liên kết nhị phân với thư viện". Sau đó, nó là một làn gió.


0

Nếu apue.3e được cài đặt, bạn có thể thử đặt apue vào thư mục mặc định của os, ví dụ:

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/

Khi mã được biên dịch, vui lòng thêm đối số: -lapue

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

0

'err_sys' và 'err_quito' có trong một tệp có tên 'errno.c' không có trong thư mục làm việc hiện tại của bạn. Trước hết, hãy mở thư mục 'apue' mà bạn đã tải xuống và giải nén và sao chép tất cả các mục trong thư mục đó, ví dụ: advio, daemon, v.v., mọi thứ vào thư mục làm việc hiện tại của bạn. Bạn có thể biết thư mục làm việc hiện tại của mình. bằng cách sử dụng lệnh 'pwd'. Bây giờ, trong thư mục 'bao gồm', bạn sẽ tìm thấy tệp tiêu đề apue. Bản sao cũng vậy cho thư mục làm việc hiện tại của bạn. Tóm lại, bất kỳ tệp .c nào bạn sẽ sử dụng trong chương trình của mình đều phải trong thư mục làm việc hiện tại của bạn. Vì vậy, sao chép tất cả các tệp vào thư mục làm việc hiện tại của bạn.

Bây giờ, để giải quyết vấn đề của bạn. Tập tin errno.c nằm trong thư mục lib trong thư mục apue. Sao chép vào thư mục làm việc hiện tại của bạn. Điều đó sẽ giải quyết vấn đề của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.