[unix] apue에서 코드 컴파일

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

이 문제를 어떻게 해결할 수 있는지 알고 싶었습니다. 또한 모든 디렉토리에서 작성한 코드를 실행할 수 있기를 원합니다.



답변

단계를 이해하는 데 도움을 준 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 인 파일을 찾는 것을 의미합니다.


답변

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

A1

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

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

A2

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

참고 문헌


답변

다음 단계가 나를 위해 일했습니다 (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해야 할 수도 있지만 간단해야합니다.


답변

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

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


답변

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


답변

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>


답변

‘err_sys’및 ‘err_quit’는 현재 작업 디렉토리에없는 ‘errno.c’라는 파일에 있습니다. 먼저, 다운로드 및 압축 해제 한 ‘apue’폴더를 열고 해당 폴더의 모든 항목 (예 : advio, deemons 등)을 현재 작업 디렉토리에 복사하십시오. 현재 작업 디렉토리를 알 수 있습니다. 이제 ‘pwd’명령을 사용하십시오. 이제 ‘include’폴더에 헤더 파일 apue가 있습니다.이 파일도 현재 작업 디렉토리에 복사하십시오. 간단히 말해서, 프로그램에서 사용할 .c 파일 현재 작업중인 디렉토리에 있으므로 모든 파일을 현재 작업중인 디렉토리에 복사하십시오.

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