내 프로젝트를 컴파일하기 위해 Makefile을 만들려고 합니다. 그러나 "math.h" 라이브러리를 사용하면 make
실패합니다. Makefile은 다음과 같습니다.
run: tema1
./tema1
build: tema1.c
gcc tema1.c -o tema1 -lm
clean:
rm *.o tema1
pow() 및 sqrt()를 사용하는 내 코드 부분은 다음과 같습니다.
float score = sqrt(k) + pow(1.25, completed_lines);
그러나 "-lm"으로 컴파일해도 여전히 다음 오류가 발생합니다.
> /tmp/ccSQVWNy.o: In function `easy_win_score': tema1.c:(.text+0x1518):
> undefined reference to `sqrt' tema1.c:(.text+0x1540): undefined
> reference to `pow' collect2: error: ld returned 1 exit status
> <builtin>: recipe for target 'tema1' failed make: *** [tema1] Error 1
이 문제의 이유와 해결 방법을 아시나요? 터미널에서 이것을 사용하는 경우 :
gcc tema1.c -o tema1 -lm
작동하지만 Makefile에서는 실패합니다.
답변1
tema1
이는 Makefile이 Make의 관점에서 빌드 방법을 설명하지 않기 때문에 발생합니다 .기본 제공 규칙:
run
에 따라 달라집니다tema1
.tema1
정의는 없지만 C 파일이 있으므로 Make는 기본 규칙(unspecified-lm
.
이 문제를 해결하려면 다음과 같이 말하세요.
tema1: tema1.c
gcc tema1.c -o tema1 -lm
build: tema1.c
기다리는 대신
자동 변수를 사용하면 중복을 줄일 수 있습니다.
tema1: tema1.c
gcc $^ -o $@ -lm
"이름 지정" 규칙( run
등 build
)을 유지하려면 구체적인 아티팩트에 종속되게 만들고( clean
아무 것도 생성하지 않으므로 제외) 구체적인 아티팩트에 대해 별도의 규칙을 추가하고 "이름 지정" 규칙을 false로 표시합니다(그래서 Make 해당 디스크 아티팩트가 예상되지 않음):
build: tema1
tema1: tema1.c
gcc $^ -o $@ -lm
.PHONY: run build clean
clean
청소할 것이 없을 때 실패하지 않도록 변경하는 것도 가치가 있습니다 .
clean:
rm -f *.o tema1