Linux 에서 C 언어 를 어떻게 프로 그래 밍 하 는 지 깊이 분석 하 다.

1.원본 프로그램의 컴 파일    Linux 아래 에서 C 언어 원본 프로그램 을 컴 파일 하려 면 GNU 의 gcc 컴 파일 러 를 사용 해 야 합 니 다.다음은 gcc 컴 파일 러 를 어떻게 사용 하 는 지 실례 를 들 어 설명 하 겠 습 니 다.다음 아주 간단 한 원본 프로그램(hello.c)이 있다 고 가정 합 니 다. int main(int argc,char **argv)  {printf("Hello Linux/n");  }
이 프로그램 을 컴 파일 하려 면 명령 행 에서 실행 합 니 다.gcc-o hello hello.c gcc 컴 파일 러 는 hello 실행 가능 한 파일 을 만 듭 니 다.실행./hello 를 실행 하면 프로그램의 출력 결 과 를 볼 수 있 습 니 다.명령 행 에서 gcc 는 우리 가 gcc 로 원본 프로그램 을 컴 파일 하 는 것 을 표시 합 니 다.-o 옵션 은 컴 파일 러 가 출력 할 수 있 는 실행 가능 한 파일 이름 을 hello 라 고 요구 하고 hello.c 는 우리 의 소스 파일 입 니 다.gcc 컴 파일 러 는 많은 옵션 이 있 습 니 다.일반적으로 우 리 는 그 중의 몇 개 만 알 면 됩 니 다.-o 옵션 은 우리 가 출력 할 수 있 는 실행 가능 한 파일 이름 을 표시 합 니 다.-c 옵션 은 컴 파일 러 에 게 목표 코드 만 출력 하 라 고 요구 합 니 다.실행 가능 한 파일 을 출력 할 필요 가 없습니다.-g 옵션 은 컴 파일 러 가 컴 파일 할 때 나중에 프로그램 에 대한 디 버 깅 정 보 를 제공 해 달라 고 요구 합 니 다.이 세 가지 옵션 을 알 게 되면 우 리 는 우리 가 쓴 간단 한 소스 프로그램 을 컴 파일 할 수 있 습 니 다.더 많은 옵션 을 알 고 싶다 면 gcc 의 도움말 문 서 를 볼 수 있 습 니 다.다른 옵션 에 대한 자세 한 설명 이 많이 있 습 니 다.2.Makefile 의 작성    만약 에 우리 가 다음 과 같은 프로그램 이 있다 고 가정 하면 소스 코드 는 다음 과 같다.
/*  main.c */ #include "mytool1.h" #include "mytool2.h"
 int main(int argc,char **argv) {  mytool1_print("hello");  mytool2_print("hello"); }
/*  mytool1.h  */#ifndef _MYTOOL_1_H#define _MYTOOL_1_H
 void mytool1_print(char *print_str);
#endif
/*  mytool1.c  */ #include "mytool1.h" void mytool1_print(char *print_str) {   printf("This is mytool1 print %s/n",print_str); }
/* mytool2.h */#ifndef _MYTOOL_2_H#define _MYTOOL_2_H
 void mytool2_print(char *print_str);
#endif/*  mytool2.c  */ #include "mytool2.h" void mytool2_print(char *print_str) {   printf("This is mytool2 print %s/n",print_str); }
물론 이 프로그램 은 매우 짧 기 때문에 우 리 는 이렇게 gcc-c main.c gcc-c my tool1.c gcc-c my tool2.c gcc-o main main main.o my tool1.o my tool2.o 를 컴 파일 할 수 있 습 니 다.그러면 우 리 는 main 프로그램 을 만 들 수 있 습 니 다.그리고 가끔 귀 찮 습 니 다.하지만 어느 날 우리 가 그 중의 한 파일(예 를 들 어 my tool 1.c)을 수정 했다 면 우 리 는 위의 명령 을 다시 입력 해 야 합 니까?아마 당신 은 이것 이 쉽게 해결 된다 고 말 할 것 입 니 다.나 는 SHELL 스 크 립 트 를 써 서 그녀 가 나 를 도와 완성 하 게 하면 되 지 않 습 니까?예,이 프로그램 에 있어 서 는 역할 을 할 수 있 습 니 다.그러나 우리 가 일 을 좀 더 복잡 하 게 생각 합 니 다.만약 에 우리 의 프로그램 이 수백 개의 소스 순서 가 있다 면 컴 파일 러 도 하나씩 컴 파일 해 야 합 니까?이 를 위해 똑똑 한 프로그래머 들 은 좋 은 도 구 를 생각해 냈 다.이것 이 바로 Make 이다.우 리 는 아래 make 를 실행 하면 위의 문 제 를 해결 할 수 있다.make 를 실행 하기 전에 매우 중요 한 파일 을 만들어 야 한다.-Makefile.위의 프로그램 에 있어 가능 한 Makefile 파일 은:\#   이것 은 위 프로그램의 Makefile 파일 main:main.o mytool1.o mytool2.ogcc-o main main.o mytool1.o mytool2.omain.o:main.c mytool1.hgcc-c mytool2.hgcc-c main.cmytool 1.hgcc-c mytool1.cmytool 2.o:mytool2.c mytool2.hgcc-c mytool2.c
이 Makefile 파일 이 있 습 니 다.그러나 우 리 는 언제 원본 프로그램의 어떤 파일 을 수정 하 였 습 니까?우 리 는 make 명령 을 실행 하기 만 하면 우리 의 컴 파일 러 는 우리 가 수정 한 파일 과 관련 된 파일 만 컴 파일 합 니 다.다른 파일 들 은 전혀 정리 하고 싶 지 않 습 니 다.Makefile 이 어떻게 작 성 했 는 지 배 워 보 겠 습 니 다.Makefile 에서 도\#시 작 된 줄 은 주석 줄 입 니 다.Makefile 에서 가장 중요 한 것 은 파일 의 의존 관 계 를 설명 하 는 것 입 니 다.일반적인 형식 은 target:components TAB rule 입 니 다.
첫 번 째 줄 은 의존 관 계 를 나 타 냅 니 다.두 번 째 줄 은 규칙 입 니 다.예 를 들 어 우리 위 에 있 는 Makefile 파일 의 두 번 째 줄 main:main.o my tool 1.o my tool 2.o 는 우리 의 목표(target)main 의 의존 대상(components)이 main.o my tool 1.o my tool 2.o 에 의존 하 는 대상 이 목표 수정 후 수정 하면,규칙 줄 에서 지정 한 명령 을 실행 해 야 합 니 다.위 에 있 는 Makefile 세 번 째 줄 에서 말 한 것 처럼 gcc-o main main main.o my tool 1.o my tool 2.o 주의 규칙 줄 에 있 는 TAB 는 TAB 키 Makefile 에 매우 유용 한 변수 가 세 개 있 음 을 표시 합 니 다.각각$@,$^,$<대표 적 의 미 는$@-대상 파일,$^-모든 의존 파일 입 니 다.$<-첫 번 째 의존 파일 입 니 다.위의 세 변 수 를 사용 하면 Makefile 파일 을 다음 과 같이 간소화 할 수 있 습 니 다.\#이것 은 간단 한 Makefile main:main.o my tool1.o my tool2.ogcc-o$@$^main.o:main.c my tool1.h my tool2.hgcc-c$간소화 한 후에 우리 의 Makefile 은 좀 간단 해 졌 지만,사람들 은 때때로 좀 더 간단 해 지고 싶 어 합 니 다.여기 서 우 리 는 Makefile 의 결 성 규칙 을 배 웁 니 다.c.o:gcc-c$<
이 규칙 은 모든.o 파일 이 해당 하 는.c 파일 에 의존 한 다 는 것 을 의미 합 니 다.예 를 들 어 my tool.o 는 my tool.c 에 의존 합 니 다.이렇게 Makefile 은\#다시 간소화 한 Makefile main:main.o my tool 1.o my tool2.ogcc-o$@$^.c.o:gcc-c$<
자,우리 Makefile 도 많 지 않 습 니 다.Makefile 규칙 에 대해 더 알 고 싶 으 면 해당 문 서 를 볼 수 있 습 니 다.3.라 이브 러 리 링크    아래 프로그램 을 컴 파일 해 보 세 요.
/* temp.c */  #include   int main(int argc,char **argv)   {         double value; printf("Value:%f/n",value);   }
이 프로그램 은 상당히 간단 하지만 gcc-o temp temp.c 로 컴 파일 할 때 다음 과 같은 오류 가 발생 합 니 다./tmp/cc33Kydu.o:In function`main':/tmp/cc33Kydu.o(.text+0xe):undefined reference to`log'collect 2:ld returned 1 exit status
이 오류 가 발생 한 것 은 컴 파일 러 가 log 의 구체 적 인 실현 을 찾 지 못 했 기 때 문 입 니 다.정확 한 헤더 파일 을 포함 하고 있 지만 컴 파일 할 때 정확 한 라 이브 러 리 를 연결 해 야 합 니 다.Linux 에서 수학 함 수 를 사용 하기 위해 서 는 수학 라 이브 러 리 와 연결 해 야 합 니 다.이 를 위해 서 는-lm 옵션 을 추가 해 야 합 니 다.gcc-o temp.c-lm 그래 야 정확 한 컴 파일 이 가능 합 니 다.앞에서 저희 가 printf 함 수 를 쓸 때 왜 라 이브 러 리 를 연결 하지 않 았 죠?이 렇 습 니 다.자주 사용 하 는 함수 의 실현 에 있어 gcc 컴 파일 러 는 자동 으로 자주 사용 하 는 라 이브 러 리 를 연결 합 니 다.그러면 우 리 는 스스로 지정 할 필요 가 없습니다.가끔 은 컴 파일 러 를 컴 파일 할 때 라 이브 러 리 의 경 로 를 지정 해 야 합 니 다.이 럴 때 우 리 는 컴 파일 러 의-L 옵션 으로 경 로 를 지정 해 야 합 니 다.예 를 들 어 우 리 는/home/hoyt/my lib 아래 에 라 이브 러 리 가 있 습 니 다.이렇게 우리 가 컴 파일 할 때-L/home/hoyt/my lib 를 추가 해 야 합 니 다.일부 표준 라 이브 러 리 에 있어 서 우 리 는 경 로 를 지적 할 필요 가 없습니다.라 이브 러 리 가 부족 한 경로 에서 만 하면 됩 니 다.시스템 의 부족 한 라 이브 러 리 경로/lib/usr/lib/usr/local/lib 는 이 세 경로 아래 의 라 이브 러 리 에 있 습 니 다.우 리 는 경 로 를 지정 하지 않 아 도 됩 니 다.또 하나의 문제 가 있 습 니 다.가끔 우 리 는 어떤 함 수 를 사 용 했 습 니 다.그런데 우 리 는 라 이브 러 리 이름 을 모 르 는데 이 럴 때 어 떡 하지?죄 송 하지만 이 문제 에 대해 저도 답 을 모 르 겠 습 니 다.저 는 바보 같은 방법 밖 에 없습니다.우선 표준 라 이브 러 리 경로 아래 에 가서 제 가 사용 하 는 함수 와 관련 된 라 이브 러 리 가 있 는 지 찾 아 보 겠 습 니 다.저 는 이렇게 스 레 드(thread)함수 의 라 이브 러 리 파일(libpthread.a)을 찾 았 습 니 다.물론 찾 지 못 하면...멍청 한 방법 밖 에 없어 요.예 를 들 어 저 는 sin 이라는 함수 가 있 는 라 이브 러 리 를 찾 으 려 고 합 니 다.nm-o/lib/*.so|grep sin>~/sin 명령 을 사용 하고~/sin 파일 을 보고 그 안 으로 가서 찾 았 습 니 다.sin 파일 에서 저 는 이런 줄 의 libm-2.1.2.so:0009 fa0 W sin 을 찾 을 수 있 습 니 다.그러면 저 는 sin 이 libm-2.1.2.so 라 이브 러 리 에 있다 는 것 을 알 게 되 었 습 니 다.저 는-lm 옵션 을 사용 하면 됩 니 다.4.프로그램의 디 버 깅    우리 가 만 든 프로그램 은 한꺼번에 성공 할 수 없습니다.우리 프로그램 에 서 는 생각 지도 못 한 많은 오류 가 발생 할 수 있 습 니 다.이 럴 때 우 리 는 우리 프로그램 을 디 버 깅 해 야 합 니 다.가장 자주 사용 하 는 디 버 깅 소프트웨어 는 gdb 입 니 다.그래 픽 인터페이스 에서 디 버 깅 프로그램 을 하려 면,그러면 당신 은 지금 xx gdb 를 선택 할 수 있 습 니 다.컴 파일 할 때-g 옵션 을 추가 하 는 것 을 기억 하 십시오.gdb 의 사용 에 대해 서 는 gdb 의 도움말 파일 을 볼 수 있 습 니 다.저 는 이 소프트웨어 를 사용 해 본 적 이 없 기 때문에 어떻게 사용 하 는 지 말 할 수 없습니다.그러나 저 는 gdb 로 프로그램 을 추적 하 는 것 을 좋아 하지 않 습 니 다.저 는 보통 프로그램 에서 중간 변수의 값 을 출력 해서 프로그램 을 디 버 깅 합 니 다.물론 당신 은 자신의 방법 을 선택 할 수 있 습 니 다.다른 사람의 것 을 배 울 필요 가 없습니다.지금 은 많은 IDE 환경 이 생 겼 습 니 다.그 안에 디 버 거 를 가지 고 있 습 니 다.몇 가 지 를 선택 하여 자신 이 좋아 하 는 것 을 찾 아 보 세 요.
5.헤더 파일 과 시스템 도움말    때때로 우 리 는 한 함수 의 대략적인 형식 만 알 고 정확 한 표현 식 을 기억 하지 못 하거나 함수 가 그 헤더 파일 에서 설명 한 것 을 기억 하지 못 할 때 가 있다.이 럴 때 우 리 는 시스템 에 도움 을 청 할 수 있다.예 를 들 어 우 리 는 fread 라 는 함수 의 정확 한 형식 을 알 고 싶다.우 리 는 man fread 시스템 을 실행 하기 만 하면 함수 의 상세 한 설명 을 출력 합 니 다.이 함수 가 있 는 헤더 파일 과 설명 합 니 다.만약 우리 가 이 함수 의 설명 을 쓰 려 고 한다 면,우리 가 man write 를 실행 할 때 출력 결 과 는 우리 가 필요 로 하 는 것 이 아 닙 니 다.왜냐하면 우 리 는 write 라 는 함수 의 설명 을 원 하기 때 문 입 니 다.그러나 write 라 는 명령 의 설명 이 나 왔 습 니 다.write 의 함수 설명 을 얻 기 위해 우 리 는 man 2 write 를 사용 해 야 합 니 다.2 는 우리 가 사용 하 는 write 라 는 함 수 는 시스템 호출 함수 이 고,또 하 나 는 우리 가 자주 사용 하 는 3 은 함수 가 C 라 는 라 이브 러 리 함수 입 니 다.언제든지 man 은 우리 의 가장 좋 은 조수 임 을 기억 하 세 요.

좋은 웹페이지 즐겨찾기