[C언어, Replit] Replit C언어 오류 해결 방법(make, makefile오류)

Replit에서 C언어 실행 시 콘솔(Console)탭에 아래와 같은 오류가 출력되는 경우가 있다.

clang-12: error: linker command failed with exit

code 1 (use -v to see invocation)

make: *** [Makefile:10: main] Error 1

가장 대표적인 사례와 해결 방법은 다음과 같다.

 

오류 사례 – 새로운 .C파일 생성 시

기본적으로 생성되는 “main.c”파일 이외에 추가로 .c파일 생성을 위해 다음과 같은 과정을 진행하는 경우가 빈번하다.

[index.c]

좌측 “New FIle”을 클릭 후 임의 파일(Index.c)을 생성한다.

[index.c2]

중앙 “Start with a code example”을 클릭하면 예제 코드를 자동 생성하며 코드를 직접 입력할 수 있다.

[index.c3]

”Hello World”를 클릭하여 예제 코드를 생성한다.

[index.c4]

새로운 코드를 생성 후 실행(Run)을 할 경우 콘솔(Console)탭에 위와 같은 오류가 출력된다.

오류가 출력되는 이유는 실행(Run)을 할 경우 프로그램 내부의 “makefile”이라는 파일에서 “main()”이라는 함수를 읽어오는데, main.c과 Index.c에서 ”int main(void)“로 중복 선언되었기 때문이다.

이 경우 main.c또는 Index.c 둘중 한 파일을 지우거나 둘 중 한 곳에서 main()함수를 제거하면 정상작동한다. 하지만 .c파일에 main()함수가 없을 경우 해당 파일은 정상작동을 하지 않는다. C언어에서 main()함수는 반드시 존재해야 한다.

이 경우 main.c와 Index.c를 둘 다 사용하는 두 가지 방법이 있다.

 

해결방법

1. gcc명령어를 사용하여 main.c와 index.c를 각각 컴파일 하기.

이 방법은 main.c와 index.c를 각각 독립된 파일로 구분하여 실행하는 방법이다.

– 각각의 파일을 독립적인 파일로 구분하여 “Shell(쉘)”에서 “gcc”명령어를 사용하여 각각의 파일을 컴파일 할 수 있다.

※“gcc 컴파일“이란 간단히 프로그래밍 언어(.c)를 전처리과정-컴파일과정-어셈블리과정-링킹과정을 거쳐 프로그래밍 언어를 컴퓨터가 이해하고, 실행 가능한 파일로 변환하는 과정을 말한다. (자세한 설명을 생략한다.)

[replit_gcc]

우측 “Shell”탭을 클릭한다. 보이지 않을 경우 좌측 하단 퀵메뉴에서 “Tools”에서 ”Shell”을 클릭하여 활성화 한다.

[replit_gcc2]

다음과 같은 명령어를 실행한다.

“ls”

“ls”는 list의 줄임말로 리눅스에서 현재 디렉토리에 있는 파일과 디렉토리 목록을 보여주는 명령어다.

처음 “ls”의 결과를 보면 현재 디렉토리에 Index.c main.c Makefile replit.nix로 총 4개의 파일이 존재 하는 것을 알 수 있다.

“gcc main.c -o main”

“gcc [A] -o [B]”는 프로그래밍 언어로 작성된 ”A“로 컴퓨터가 실행 가능한 파일 [B]을 생성하는 명령어 이다. 따라서 “gcc main.c -o main”“main.c”을 해석하여 실행가능한 파일 “main“를 생성하는 명령어이다.

※이때 [B]부분은 꼭 원본 파일 [A]의 이름과 같을 필요는 없다.

이후 다시 “ls”명령어를 실행하여 “main”파일이 새로 생긴 것을 확인할 수 있다.

“./main”

“./main”실행파일을 실행하는 명령어이다. 실행 결과를 보면 “main.c”에 작성된 코드로 “I am main.c”가 출력된 것을 볼 수 있다.

이와 동일하게 ”Index.c”를 실행 할 수 있다.

[replit_gcc3]

이 경우 코드를 변경 할 때 마다 “gcc“명령어로 실행파일을 매번 새로 생성해야한다.

 

2. Index.c를 Index.h(헤더파일)로 변경 후 main.c에서 참조하기

이 방법은 index.c파일을 .c가 아닌 .h(헤더파일)로 변경 후 main.c에서 불러오는 방법이다. main.c를 메인 코드로 작성 후 Index.h의 코드를 불러와 사용할 수 있다.

[replit_rename]    [replit_rename2]

“Index.c”를 헤더파일로 변경하기 위해 이름을 “Index.h”로 변경한다.

[replit_rename3]

“Indedx.h”파일에서 기존 “main()“함수의 이름을 사용하고자 하는 이름(“print_index()”)으로 변경한다.

[replit_rename4]

”main.c”에서 “#include “Index.h”를 추가하고, “Index.h”에서 구현한 함수 “print_index()”를 사용하고자 하는 위치에 입력한다.

이후 실행(Run) 버튼을 누르면 “Console”에 출력된 것을 볼 수 있다.

이 경우 현재 파일 목록에 ”main()“함수가 ”main.c“에만 존재하기 때문에 실행(Run)버튼을 눌러 자동으로 컴파일 된 것이다.

 

Replit에서 c언어를 작성할 경우 가장 추천하는 방법.c파일은 메인 실행파일로서 한 개만 만들어 main()함수를 사용하고, 여러 코드를 작성할 경우 헤더파일(.h)로 작성하여 메인 .c파일에서 불러오는 방법(2번째 방법)을 추천한다.

2 thoughts on “[C언어, Replit] Replit C언어 오류 해결 방법(make, makefile오류)”

Leave a Comment