문제, 오류내용
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. 공부할것이 굉장히 많은데 내가 꽤 엉덩이를 잘 붙이고 앉아있는것을 보아 꽤 재밌어하는것 같다.
'프로그래밍 > C,C++' 카테고리의 다른 글
배열(array) 예제와 함께 가볍게 알아보기 (0) | 2023.06.05 |
---|---|
형변환(type casting) (0) | 2023.06.05 |
[C/C++]while, for, switch, rand 알아보기 (0) | 2023.06.04 |
C 예제 2번째 (홀짝게임) (0) | 2023.06.04 |
[오류_C/C++] Mac에서 sleep함수 사용하는 방법 feat 버퍼링 (0) | 2023.06.04 |