development

sqrt (또는 기타 수학 함수)에 대한 정의되지 않은 참조

big-blog 2021. 1. 6. 20:43
반응형

sqrt (또는 기타 수학 함수)에 대한 정의되지 않은 참조


이 간단한 코드가 있습니다.

max = (int) sqrt (number);

헤더에는 다음이 있습니다.

#include <math.h>

그러나 응용 프로그램은 여전히 sqrt. 여기에 문제가 있습니까? 모든 것이 괜찮을 것 같습니다.


사용중인 시스템에 관계없이 다음과 같이 수학 라이브러리와 연결해야 할 수 있습니다.

gcc -o myprog myprog.c -L/path/to/libs -lm
                                       ^^^ - this bit here.

헤더를 포함하면 컴파일러가 함수 선언에 대해 알 수 있지만 반드시 해당 함수를 수행하는 데 필요한 코드에 자동으로 연결되는 것은 아닙니다 .

실패하면 코드, 컴파일 명령 및 실행중인 플랫폼 (운영 체제, 컴파일러 등)을 보여 주어야합니다.

다음 코드는 잘 컴파일되고 연결됩니다.

#include <math.h>
int main (void) {
    int max = sqrt (9);
    return 0;
}

그냥 알고 있어야 일부 편집 시스템 라이브러리는 명령 행에서 제공되는 순서에 따라 달라집니다. 즉, 라이브러리를 순서대로 처리하고 시퀀스의 해당 지점에서 해결되지 않은 기호를 충족시키는 데만 사용할 수 있습니다 .

예를 들어 다음과 같은 명령이 있습니다.

gcc -o plugh plugh.o -lxyzzy
gcc -o plugh -lxyzzy plugh.o

그리고 plugh.o로부터 뭔가가 필요 xyzzy라이브러리를 예상대로, 두 번째는 작동하지 않을 수 있습니다. 라이브러리를 나열하는 지점에는 충족 할 해결되지 않은 기호가 없습니다.

plugh.o do 에서 해결되지 않은 기호 나타나면 너무 늦었습니다.


나는 당신이 math.h를 가져 왔다고 가정합니다. #include <math.h>

그래서 내가 볼 수있는 유일한 다른 이유는 누락 된 연결 정보 입니다. 코드를 -lm옵션 과 연결해야합니다 .

단순히 gcc로 하나의 파일을 컴파일하려는 경우 -lm명령 줄에 추가 하고 그렇지 않으면 빌드 프로세스에 대한 정보를 제공하십시오.


#include <math.h>마지막에 Makefile에 in c 소스 파일과 -lm을 추가하면 효과 가 있습니다.

    gcc -pthread -o p3 p3.c -lm

여기에 먼저 당신이 헤더를 포함해야, 내 관찰이다 math.h로서 sqrt()기능을 선언 math.h헤더 파일. 예를 들어

#include <math.h>

당신의 매뉴얼 페이지를 읽으면 둘째, SQRT 이 줄 알 -lm와 링크.

#include <math.h> /* header file you need to include */

double sqrt(double x); /* prototype of sqrt() function */

Link with -lm. /* Library linking instruction */

그러나 응용 프로그램은 여전히 ​​sqrt에 대한 정의되지 않은 참조를 말합니다. 여기에 문제가 있습니까?

프로그램을 라이브러리와 연결하지 않았기 때문에 컴파일러 오류가 정확하며 lm링커가에 대한 참조를 찾을 수 없으므로 sqrt()명시 적으로 연결해야합니다. 예를 들어

gcc -Wall -Wextra -Werror -pedantic test.c -lm

같은 문제가 있었지만 코드를 실행하는 명령 뒤에 -lm을 추가하여 간단히 해결했습니다. 예. gcc code.c -lm

참조 URL : https://stackoverflow.com/questions/5248919/undefined-reference-to-sqrt-or-other-mathematical-functions

반응형