프로그래밍/C,C++

[오류_C/C++] clang: error: linker command failed with exit code 1 (use -v to see invocation) 에러

gameObject 2023. 6. 5. 01:17
728x90

문제, 오류내용

clang: error: linker command failed with exit code 1 (use -v to see invocation) 에러

 

당당하게 적혀있는 에러를 볼 수 있다.

오류가 발생한 코드는 아래와 같다.

#include <iostream>
#include <time.h> //시간
#include <stdlib.h> //rand,srand
#include <unistd.h> // <windows.h> 대체
#include <curses.h>

int main(){
    setbuf(stdout, NULL); // 버퍼링 비활성화

    int dice = 0;
    int dice2;
    srand(time(NULL));

    printf("주사위의 숫자는 : ");

    dice2 = getch();

    if(dice2 == 1){

        for(int count = 0; count < 3; count++){
            sleep(1);
            dice = rand()%6+1;
            printf("%d ",dice);

        }
    }
    printf("\n");
}

 

C언어 공부하면서 다른분들은 windows를 사용하여

#include<windows.h> + getch(); 함수를 이용해서 문자를 입력받는것을 수행중이었다.

 

scanf("%c",char) 를 이용하게 되면 입력된 문자 한개와 \n이 중복으로 입력되어

실행시 printf가 두번되는 오류가 발생하게되는데

getch()를 이용하면 그 문제가 해결된다는 점 때문이었다.

 

windows.h헤더파일과 비슷하게 mac 에서 getch()를 이용할 수 있는 헤더파일이 curses.h 헤더파일이다.

 

그런데 컴파일이 안되는 오류가 뜨는것이다.

 

해결방법

1. clang: error: linker command failed with exit code 1 (use -v to see invocation) 에러를 구글에 검색을 해보았다.

 - 엄청나게 많은 답변을 찾아 볼 수 있었다. 하지만 속시원하게 내 문제를 해결해 주는것은 하나도 없었다.

 - 그때 떠올랐다. 에러를 제대로 읽어보면 대부분 해결할 수 있다고...

 

2. 에러를 제대로 읽어보았다. linker라는 단어가 눈에 띄었다. 그리고 이때서야 위쪽에 있는 글자들도 눈에 들어왔다.

    네개의 단락으로 나누어서 해석해보자

  • /usr/bin/clang++ -fcolor-diagnostics -fansi-escape-codes -g /Users/baekyungtaek/Programer/cpp/practice/yehje.cpp -o /Users/baekyungtaek/Programer/cpp/practice/yehje
  • Undefined symbols for architecture arm64:
      "_stdscr", referenced from:
          _main in yehje-5fe67c.o
      "_wgetch", referenced from:
          _main in yehje-5fe67c.o
  • ld: symbol(s) not found for architecture arm64
  • clang: error: linker command failed with exit code 1 (use -v to see invocation)

 

1번 : clang++로 컴파일을 할꺼고 너의 오류를 색으로 나타내서 보여줄께, 컴파일 할 파일은 yehje.cpp이고 yehje라는 실행파일을 생성해줄께

2번: 아키텍쳐 arm64에서 심볼이 정의되지 않았어, "_stdscr"과 "_wgetch" 두가지 말이야.

3번: 링커(ld)가 심볼을 못찾아

4번: 그래서 clang이 linker오류를 보내는거야.

 

3. 자, 그럼 이제 어떻게 해야할까. 이제는 구글에게 질문을 다른방식으로 할 수 있겠다.

    알맞게 링크를 하려면 어떻게 해야되니? 하고 질문해보자

 

4. 완벽한 해결방법은 아닌것 같지만, 해결이 되었다.

    task.json파일을 수정해보았다.

 

5. 이제 링크 오류는 뜨지 않지만, 그래도 getch();는 제대로 동작하지 않았다.....

  - 좀 찾아보니 cursers라는것 자체가 Unix?(이것도 공부가 필요함) 관련으로 만들어진 헤더파일이고

  - macOS는 리눅스와 연관이 있다보니 해당 헤더파일을 사용하는것 같다.

  - cursers 이름에서 느껴지듯이 근본 자체는 커서를 사용하고 윈도우를 만들고 그러는데 이용되는 헤더파일로 보인다.

 

6. 그냥 stdlib.h에 들어있는 getchar();함수를 사용해야겠다.

느낀점

1. 어쨋든 링크 오류가 뜬다면, 헤더파일과 링크가 잘 연동이 되어있는지를 체크해보자.

2. 커멘드 공부가 자연스럽게 되었고

3. task.json같은 파일이 왜 있는지를 대략 알 수 있게 된것같다.

4. 공부할것이 굉장히 많은데 내가 꽤 엉덩이를 잘 붙이고 앉아있는것을 보아 꽤 재밌어하는것 같다.

728x90