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파일 생성을 위해 다음과 같은 과정을 진행하는 경우가 빈번하다.
좌측 “New FIle”을 클릭 후 임의 파일(Index.c)을 생성한다.
중앙 “Start with a code example”을 클릭하면 예제 코드를 자동 생성하며 코드를 직접 입력할 수 있다.
”Hello World”를 클릭하여 예제 코드를 생성한다.
새로운 코드를 생성 후 실행(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)를 전처리과정-컴파일과정-어셈블리과정-링킹과정을 거쳐 프로그래밍 언어를 컴퓨터가 이해하고, 실행 가능한 파일로 변환하는 과정을 말한다. (자세한 설명을 생략한다.)
우측 “Shell”탭을 클릭한다. 보이지 않을 경우 좌측 하단 퀵메뉴에서 “Tools”에서 ”Shell”을 클릭하여 활성화 한다.
다음과 같은 명령어를 실행한다.
“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”를 실행 할 수 있다.
이 경우 코드를 변경 할 때 마다 “gcc“명령어로 실행파일을 매번 새로 생성해야한다.
2. Index.c를 Index.h(헤더파일)로 변경 후 main.c에서 참조하기
– 이 방법은 index.c파일을 .c가 아닌 .h(헤더파일)로 변경 후 main.c에서 불러오는 방법이다. main.c를 메인 코드로 작성 후 Index.h의 코드를 불러와 사용할 수 있다.
“Index.c”를 헤더파일로 변경하기 위해 이름을 “Index.h”로 변경한다.
“Indedx.h”파일에서 기존 “main()“함수의 이름을 사용하고자 하는 이름(“print_index()”)으로 변경한다.
”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오류)”