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
'development' 카테고리의 다른 글
파이썬 슈퍼 메서드 및 호출 대안 (0) | 2021.01.06 |
---|---|
인터넷에서 localhost에 액세스 (0) | 2021.01.06 |
os.system () 또는 subprocess.call ()을 사용할 때 콘솔을 숨기려면 어떻게해야합니까? (0) | 2021.01.06 |
jQuery를 사용하여 형제 요소를 어떻게 선택합니까? (0) | 2021.01.06 |
Objective-C 프로토콜 전달 선언 (0) | 2021.01.06 |