개발자 데뷔!

Linux 빌드시스템 본문

DevOps/Linux

Linux 빌드시스템

물꼮이 2024. 5. 3. 14:14

 

컴파일러 설치 

C언어 컴파일러 : gcc(GNU Compiler Collection)

gcc 설치 버전 확인

// gcc 컴파일러 설치/버전 확인
gcc -dumpversion

설치 시 ) 

[Linux] gcc 버전 확인 명령어

 

 

빌드 기본 패키지 설치 

// 개발 패키지 설치 _ gcc, libc6-dev 등...
sudo apt-get install build-essential

 

 

 

 

소스코드 작성 & 빌드

 

아래와 같은 과정으로 소스코드 리눅스 시스템 내에서 빌드할 수 있다. 

(vi) 코드작성  ->  (gcc) 빌드  ->  (./) 실행
// 소스코드 파일 생성&작성
vi hello.c
// .. 소스코드 내용 작성 후 저장(c파일) ...

// 소스코드 빌드 
gcc hello.c
// 생성된 실행파일명 확인
ls 
// 실행파일 실행
./a.out

 

위에서 실행되는 hello.c 소스코드는 아래와 같이 작성했다.

#include <stdio.h>

int main(int argc, char *argv[]){
        printf("Hello, World!\n");
        return 0;
}

[Linux] gcc 빌드결과

 

빌드 옵션

옵션 기능 사용 예시
-o 만들어질 실행파일 이름 지정 gcc -o {실행파일명} {소스코드파일명} gcc -o hello hello.c
-Wall (버그) 빌드 시 경고 옵션 전부 활성화
 - 인자수 / 타입 오기입 경고
gcc -Wall {소스코드파일명} gcc -Wall hello.c
-O1
-O2
-O3
(버그) 빌드 시 최적화(optimization)
- 뒤에 붙은 숫자 클수록 강력한 최적화
- O3 는 컴파일러에 의한 버그 가능성 多
- O2 를 일반적으로 사용
gcc -O1 {소스코드파일명} gcc -O1 hello.c

 

* 최적화 : 실행속도를 가능한 범위 내에서 향상시켜줌

* 실행파일 :  .out 등 확장자 없이도 실행파일명으로 지정 가능 

[Linux] gcc 옵션 -o

 

 

 

버그 & 디버거

: 리눅스에서 개발할 때 gdb(GNU Debugger) 가 많이 사용됨 

  • 세그멘테이션 폴트 (Segmentation fault) 
    • NULL 포인터를 참조하는 경우
    • 배열의 범위를 넘어서 접근하는 경우 
    • 리눅스에서 해당에러가 발생하면 강제종료 

 

 

실행인자 

// echo 명령어 +  x y z는 실행 인자
echo x y z

 

...
int main(int argc, char *argv[]) {
...
  • argc :  실행인자의 개수
  • argv : 실행인자의 내용을 문자열 배열 형태로 담고 있는 것. (char 포인터 타입)

다음과 같이 실행명령어를 치면 아래와 같이 입력된다. 

{실행명령어} {실행인자1} {실행인자2} ...
./hello x y z
argv[0]  ->  ./hello\0
argv[1]  ->  x\0
argv[2]  ->  y\0
argv[3]  ->  z\0

 

argv[0] 에는 프로그램 실행 시 입력한 명령어 자체가 들어간다. 

그 이후 argv[1] ~ 에는 실행인자가 들어간다. 

즉,  argc 는 항상 1 이상이다. 

 

아래와 같이  실행인자를 모두 출력하는 args.c 파일 작성 후 실행해보자. 

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
        int i;
        printf("argc=%d\n", argc);
        for(int i=0; i<argc; i++){
                printf("argv[%d]=%s\n", i, argv[i]);
        }
        exit(0);
}

 

[Linux] 실행명령어와 실행인자

 

  • 큰 따옴표(" ")로 묶으면 감싼 부분을 하나의 실행 인자로 묶어준다. => 셸(shell)의 기능 

[Linux] 실행명령어와 실행인자 ""

 

  • 와일드 카드(glob 패턴 -ex_ '*', '?')을 사용하면, 파일 이름의 집합을 표현 할 수 있다.
    • 파일 이름의 집합은 셸(shell)이 개별인자로 바꾸어 준다. 

[Linux] 실행명령어와 실행인자 와일드카드 사용

 

 

함수 정보 얻기 

리눅스에서 c 프로그래밍을 할 때, 셸 명령어로 함수에 대한 정보를 간단히 얻을 수 있다. 

크게  man 명령어info 명령어가 있다. 

man 명령어

: 특정 함수의 스펙을 조사할 때 쓰는 명령어 

man {알아볼 함수명}
man {참고할 페이지 number} {알아볼 함수명}

 

사용예시)

man strlen
man printf
man 3 printf

 

man 페이지는 내용에 따라 여러 섹션으로 구분되어 있다. 

 - 섹션 1부터 차례로 조사해, 가장 먼저 발견한 섹션 페이지를 표시해준다. 

 - 여러 섹션에 동일한 이름의 페이지가 존재할 수도 있다. 

섹션 분류
1 실행 가능한 프로그램&셸 명령어
2 시스템 콜
3 라이브러리 함수
4 특별한 파일(디바이스 파일) 등
5 파일 포맷
6 게임
7 규격 등
8 시스템 관리용 명령어

 

strlen()함수의 정보를 알아보면 아래와 같이 해당 함수에 대한 설명이 나온다 

사용법 및, 포함된 헤더파일명, 타입도 상세히 나와 유용하게 쓸 수 있다. 

strlen의 경우 페이지 섹션3 에서 찾아 STRLEN(3)과 같이 표시된다. 

[Linux] man 명령어 사용결과

 

info 명령어 

: GNU가 만든 문서시스템

GNU libc 는 man보다 info를 먼저 참조해야 한다.