apue에서 코드 컴파일


12

지금 은 유닉스 환경에서 고급 프로그래밍 책을 읽기 시작했습니다 . 첫 번째 코드 예제를 실행하려고했습니다. 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}에서 오기 를 기대 합니까?
Chris Down

압축되지 않은 소스 코드 include에는 헤더 파일 이있는 디렉토리 가 있습니다 () apue.h. 그러나 이것은 해당 디렉토리에있는 유일한 파일입니다. 실제 함수 정의가 어디에 있는지 이해하지 못합니다! 누군가이 책의 소스 코드 파일 구조에 익숙 할 것이라고 생각했습니다.
makhlaghi

.h파일은 기능에 대한 protypes을 포함한다. 그들의 구현은 상자에 있어야 .so하거나 .a파일에 있어야합니다. 이들은 함수를 포함하는 동적 및 정적 라이브러리입니다.
slm

무엇입니까 apue.h?
목소리

답변:


13

단계를 이해하는 데 도움을 준 slm 덕분에 UNIX® 환경의 고급 프로그래밍에서 프로그램을 작성하고 컴파일하는 방법에 대한 간단한 검토 . 여기 에서 소스 코드 다운로드 할 수 있습니다 . 이 정보가 책의 부록 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

-Igcc포함 파일을 찾을 디렉토리를 알려줍니다 . -L라이브러리 디렉토리의 위치를 -lapue알려주고 해당 디렉토리에서 찾을 라이브러리 파일의 이름을 알려줍니다. -LXXX는 라이브러리 디렉토리에서 이름이 libXXX.a 또는 libXXX.so 인 파일을 찾는 것을 의미합니다.


더 자주 경고하도록 명령에 추가 -Wall하는 것이 때때로 깨달을 수 있습니다 gcc.
MattBianco

3

스택 오버 플로우 Q & A 제목 : err_sys () 함수는 어디에 정의되어 있습니까? 필요한 것이 있습니다. 그 스레드의 답변 중 2 개는 다음과 같이 말했습니다.

A1

err_sys ()는 W. Richard Stevens가 작성한 여러 책에서 사용되는 함수입니다. 이 기능은 발생한 오류 유형을 인쇄하는 데 사용됩니다.

이 함수는 사용자 정의 헤더 파일 "ourhdr.h"(또는 다른 것)가있는 텍스트의 프로그램에서 사용됩니다. 헤더 목록이나 함수 정의에 대해서는 부록을 확인하십시오.

A2

이 기능의 소스 (UNIX® 환경의 고급 프로그래밍, W. Richard Stevens)는이 책의 웹 사이트 ( http://www.apuebook.com/) 에서 찾을 수 있습니다 .

참고 문헌


고맙지 만 내 문제는 그것을 컴파일하는 방법이므로 이러한 오류가 발생하지 않습니다. 이것은 err_sys단지 예일 뿐이며, 해당 헤더 파일에 다른 기능이 있습니다. 따라서이 특정 함수를 다시 작성하지 않고이 문제에 대한 일반적인 대답 (헤더 파일을 포함하고 성공적으로 컴파일하는 방법)을 찾고 있습니다.
makhlaghi

1
@makhlaghi-오류는 기본 구현이 누락 된 b / c입니다. 일반적으로 사용할 라이브러리를 참조하는 인수를 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

@makhlaghi-언급하지 마십시오. 나는 다른 사람들이 일이 어떻게 작동하는지 이해하도록 돕는 것을 좋아합니다. 믿거 나 말거나, 설명해야하므로 더 잘 이해하는 데 도움이됩니다. gcc 여행에 대한 Q와 행운을 빌어 주셔서 감사합니다!
slm

2

다음 단계가 나를 위해 일했습니다 (Ubuntu 14.04 64bit).

  1. wget http://www.apuebook.com/src.3e.tar.gz공식 서적 사이트 에서 gzip으로 압축 된 tar 아카이브 다운로드
  2. tar xzf src.3e.tar.gzapue.3e기본적으로 현재 디렉토리 아래에 압축이 풀린 폴더가 생성 됩니다.
  3. cd apue.3e
  4. sudo apt-get install libbsd-dev. 이것은 / threads의 링크 -lbsd에 대한 것입니다.
  5. make 이것은 모든 폴더의 모든 소스 코드를 자동으로 컴파일합니다.
  6. cd intro그런 다음 ./ls1 ..예상대로 작동합니다 (부모 디렉토리의 파일 나열)

책에서 다른 코드 스 니펫을 찾으려면 grep해야 할 수도 있지만 간단해야합니다.


1

그의 마지막 의견에서 makhlighi가 설명 한 것은 저에게 효과적이지만 공식 웹 사이트 www.apuebook.com이 아닌 다른 소스 코드를 사용해야했습니다.

내가 사용한 것은 https://github.com/roktas/apue2e 에서 찾을 수 있습니다 . 누군가가 설명했듯이 이것은 현대 리눅스 시스템에서 작동하기 위해 구현되었습니다.


아마도 당신은 이것을 조금 정교하게 할 수 있습니까?
slm

0

여기에 제공된 명령 줄 명령을 사용하여 라이브러리를 성공적으로 빌드했습니다. Xcode에서 샘플을 작성하는 데 어려움이있었습니다. 이를 위해 헤더 파일 및 라이브러리의 검색 경로를 정의했습니다 ( "빌드 설정"창). 라이브러리와 바이너리 연결 창보다 "빌드 단계"에서 라이브러리 자체를 정의한 것보다. 그 후에는 산들 바람입니다.


0

apue.3e 가 설치되어 있으면 다음과 같이 os 기본 디렉토리에 apue를 넣으십시오.

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, deemons 등)을 현재 작업 디렉토리에 복사하십시오. 현재 작업 디렉토리를 알 수 있습니다. 이제 'pwd'명령을 사용하십시오. 이제 'include'폴더에 헤더 파일 apue가 있습니다.이 파일도 현재 작업 디렉토리에 복사하십시오. 간단히 말해서, 프로그램에서 사용할 .c 파일 현재 작업중인 디렉토리에 있으므로 모든 파일을 현재 작업중인 디렉토리에 복사하십시오.

이제 errno.c 파일은 apue 폴더의 lib 폴더에 있습니다. 현재 작업 디렉토리에 복사하면 문제가 해결됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.