-내 Makefile에서는 lm이 작동하지 않습니다.

-내 Makefile에서는 lm이 작동하지 않습니다.

내 프로젝트를 컴파일하기 위해 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

"이름 지정" 규칙( runbuild)을 유지하려면 구체적인 아티팩트에 종속되게 만들고( clean아무 것도 생성하지 않으므로 제외) 구체적인 아티팩트에 대해 별도의 규칙을 추가하고 "이름 지정" 규칙을 false로 표시합니다(그래서 Make 해당 디스크 아티팩트가 예상되지 않음):

build: tema1

tema1: tema1.c
        gcc $^ -o $@ -lm

.PHONY: run build clean

clean청소할 것이 없을 때 실패하지 않도록 변경하는 것도 가치가 있습니다 .

clean:
        rm -f *.o tema1

관련 정보