ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리눅스 C언어 개발환경
    C,C++ 2024. 3. 5. 18:36

    어제는 블로그를 처음 만들어서 신나는 마음에 너무 초보같지 않은 코드를 포스팅 한거같다. 이제 C언어 개발환경을 구축한지 한달정도 되어가지만 기억더듬기 + gpt 형님의 도움으로 개발환경 구축을 포스팅 하려고 한다.

    먼저 터미널을 열고 아래 내용을 입력하자 C언어를 컴파일 하기 위한 gcc 설치 과정이다.

     

    sudo apt update
    sudo apt install build-essential

     

    그리고 스냅 관리자를 이용해서 VS code를 설치한다. 사실 이렇게는 안해봐서 되는지는 모르겠다... 예전엔 다른방법으로 한거같은데 기억이 안나유ㅠㅠㅠㅠ 일단 gpt 형님이 이렇게 하라고 하셨으니 다른 PC에 세팅할 때 테스트 해보겠다.

    sudo snap install --classic code

    VS Code를 설치하면 실행한 뒤 아래 그림의 빨간색으로 표시한 아이콘을 클릭하고 파란색으로 표시한 부분에 C/C++을 검색해서 C/C++ Extension을 설치한다.

    다음으로 코딩 시작의 근본중의 근본인 헬로월드를 만들어 보자.

    상단의 파일->폴더열기를 통해 프로젝트 폴더로 이동한다. 그리고 컨트롤+쉬프트+E(VS code 탐색기 단축키)를 누른뒤 아래와 같이 새파일을 누르고 helloworld.c 파일을 만들어주자

    아래와같이 코드를 작성하고 

    #include <stdio.h>

    int main() {
    printf("Hello, World!\n");
    return 0;
    }

    터미널을 열고 (컨트롤+쉬프트 +`)

    gcc -o helloworld helloworld.c
    ./helloworld

    를 입력하면 된다. 그럼 헬로월드가 뜬다!!! 하지만 여기서 끝내면 재미가 없으니 .h 파일로 링크하는 법과 메이크파일을 만들어 빌드까지 해보려고 한다.

    먼저 Makefile  helloworld.c  helloworld.h  main.c 파일들을 만든다 helloworld.c의 함수가 helloworld.h 를 통해 main.c 에 링크될거다.

    <helloworld.c>

    #include <stdio.h>
    #include "helloworld.h"

    void print_hello() {
    printf("Hello, World!\n");
    }

     

    링크를 위해 helloworld.h를 인클루드 해줬다. 그리고 원래의 메인함수를 아무값도 반환하지 않는 void 함수로 변환해줬다.  <helloworld.h>

    void print_hello();

    <main.c>

    #include <stdio.h>
    #include "helloworld.h"

    int main() {
    print_hello();
    return 0;
    }

    helloworld.h는 간단하다 단순히 함수의 프로토 타입을 선언해주면 된다 만약 전역변수를 공유하려고 한다면 여기에 선언해야한다.

    main.c는 링크를 위해 helloworld.h를 인클루드 해주고 단순히 프린트 헬로 함수만 호출했다.

    <Makefile>

    CC=gcc #GNU Compiler Collection(GCC)을 사용하여 C 프로그램을 컴파일하기 위해 사용될 컴파일러를 정의한다. 여기서 gcc는 C 컴파일러.
    CFLAGS=-I. #파일 시 사용될 플래그를 정의한다.
    #-I. 플래그는 컴파일러에게 현재 디렉토리(.)를 포함 경로로 추가하라는 지시임. 즉 helloworld.h와 링크하기 위한 옵션임.

    SRCS=main.c helloworld.c #컴파일할 소스 파일의 리스트를 정의한다. 이 예시에서는 main.c와 helloworld.c 두 파일을 컴파일한다.
    # 만약 현재 폴더내의 모든 파일을 컴파일 하기 원한다면 "$(wildcard *.c)" 를 이용하면 폴더내의 모든 .c 파일을 컴파일 할 수 있다.
    OBJS=$(SRCS:.c=.o)#SRCS 변수에서 정의된 소스 파일 이름을 기반으로 오브젝트 파일 이름을 생성한다.
    TARGET=helloworld#최종 실행 파일의 이름을 정의합니다. 이 경우, 실행 파일의 이름은 helloworld!!

    .PHONY: all clean #make 명령어가 all과 clean 타겟을 실제 파일로 오인하지 않도록 한다. all과 clean은 실제 파일 이름이 아니라 명령어 이름이다.

    all: $(TARGET)#all 타겟은 기본 타겟으로, make 명령어만 입력했을 때 실행된다. 이 타겟은 $(TARGET)(여기서는 helloworld)을 만들기 위한 의존성을 정의한다.

    $(TARGET): $(OBJS) #최종 실행 파일을 만들기 위한 규칙. 오브젝트 파일들($(OBJS))을 링크하여 실행 파일 $(TARGET)을 생성한다.
    $(CC) -o $@ $^ $(CFLAGS)

    %.o: %.c #: 모든 .c 파일을 .o 오브젝트 파일로 컴파일하기 위한 패턴 규칙이다.
    $(CC) -c -o $@ $< $(CFLAGS)

    clean:#make clean 명령어를 실행하면 오브젝트 파일들과 실행 파일을 삭제한다.
    rm -f $(OBJS) $(TARGET)

    메이크 파일은 익숙하지 않아서 나중에 참고할겸 주석을 달아놨다. C 파일을 실행하기 위해선 컴파일과 빌드 과정이 필요하다. .c 확장자를 .o로 변경하여 오브젝트 파일 리스트를 생성한다. 예를 들어, main.c와 helloworld.c는 main.o와 helloworld.o로 변환한다. 리눅스에선 .c 파일을 .o 파일로 변환하는 과정을 컴파일이라고 부른다. 이 과정을 통해 컴파일러는 소스 코드를 기계어로 변환한 후 오브젝트 파일을 생성한다. 이후 오브젝트 파일을 링크하여 실행 파일을 생성한다. 이 과정을 빌드라고 부른다.

    이제 터미널에 make 명령어를 써주면 빌드가 된다.

    짠! 사실 이번 경우는 매우 간단한 케이스지만 복잡한 프로젝트를 진행할때 기능을 캡슐화 하기 위해 사용하면 좋을것같다. 

    'C,C++' 카테고리의 다른 글

    C언어를 이용한 파일시스템 엑세스!  (0) 2024.04.13
    lock free queue  (2) 2024.03.05
Designed by Tistory.