솟수 고하는 C프로그램에서 sqrt()함수를 못찾네요..
C 공부하다 솟수(prime number)구하는 프로그램 짜보려구 하는데
math.h의 sqrt()함수 때문에 에러가 나는거 같은데...
왜 이런지 모르겠어요..
도움 부탁드립니다..
소스코드
--------------------------------------------------------------------------------------------------------------------------------------------------------
#include
#include
int is_prime(int n);
main()
{
int n;
printf("\nEnter the number : ");
scanf("%d", &n);
if (is_prime(n) == 0)
printf("\n --> the digit, %d is not a prime number!\n", n);
else
printf("\n --> the digit, %d is a prime number!\n", n);
}
int is_prime(int n)
{
int i;
if (n == 2)
return 1;
if (n % 2 == 0)
return 0;
for (i = 3; i
if (n % i == 0)
return 0;
return 1;
}
--------------------------------------------------------------------------------------------------------------------------------------------------------
에러메시지
$ gcc prime.c
/tmp/ccAldoMJ.o: In function `is_prime':
prime.c:(.text+0x106): undefined reference to `sqrt'
collect2: ld returned 1 exit status
$
흠....
프로그래밍을 못하는 편이지만
일단 sqrt함수가 뭔질 모르겠네요...
뭐 저 얘기 하는걸 보면 헤더파일이 잘못된것같은데...
일단 제가 짜보자면 이렇습니다
#include
#include
int is_prime(int n);
main()
{
int n;
printf("\nEnter the number : ");
scanf("%d", &n);
if (is_prime(n) == 0)
printf("\n --> the digit, %d is not a prime number!\n", n);
else
printf("\n --> the digit, %d is a prime number!\n", n);
}
int is_prime(int n)
{
if (n==2) return 1;
for (int i=2;i if (n%i!=0) return 0;
return 1;
}
요렇게 하면 될것 같은데...
속도문제라고 해도
int 형이 커봐야 프로그램이
int 형의 가장 큰 숫자만큼 for문을 돌아도
1초조차 안걸리기 때문에 큰 문제가 있어보이진 않는데...
C 공부하다 솟수(prime
C 공부하다 솟수(prime number)구하는 프로그램 짜보려구 하는데
math.h의 sqrt()함수 때문에 에러가 나는거 같은데...
왜 이런지 모르겠어요..
도움 부탁드립니다..
소스코드
--------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------- 원문 인용 끝 ----------------------------------
답은 정말 간단한 곳에 있습니다.
$gcc prime.c -lm
끝에 "마이너스 엘 엠"을 붙여주지 않아서 그런 문제가 발생한 것입니다.
수학라이브러리를 사용하는 경우, 즉 math.h를 include했다면 컴파일할때 반드시 -lm을 붙여주셔야 합니다. 그렇지 않으면 위와 같은 메시지를 봅니다.
---- 서명----------
한 걸음 더 가까이
답변 감사합니다 ^^
새롭게 리눅스에 빠저들게 되서 리눅스환경에서 프로그래밍을 해보구 있던차에.. 생긴 문제입니다.
혹시 math.h 라이브러리 말고 컴파일시 옵션이 필요한 다른 라이브러리도 있나요?
man sqrt 해 보면..
중간에 SYNOPSIS부분에 아래처럼 나옵니다.
즉 sqrt()함수를 쓰기 위해서는 math.h 를 인클루드 하고 링크단계에서는 -lm을 붙이라는 것이죠. 다른 함수들도 man page보면 저런 식으로 안내가 나올 것입니다.
덤으로 어떤 함수는 쉘 명령어와 이름이 같아 안 보이는 함수는 -s 옵션으로 2번, 혹은 3번 세션을 여시면 됩니다.
man -s 3 sqrt 하셔도 되고 리눅스에서는 그냥 man 3 sqrt하셔도 됩니다.
=================
잠못자는 한솔아빠
답변 감사합니다.. ^^
근데 SYNOPSIS가 뭐죠? C의 도큐먼트 같은 건가요?
man page 안에 항목입니다.
man [함수이름] 으로 함수 매뉴얼 페이지를 읽어오면 그 내용중에 SYNOPSIS라는 섹션이 있습니다. 터미널에서 man sqrt를 쳐 보세요.
beggarstar@beggargalaxy ~ $ man sqrt
맨윗줄 SQRT(3) 에서 3은 세션 번호입니다. 동명이인 찾듯이 C함수, 쉘 명령어, 프로그램 이름이 같을 경우 세션으로 구분해 줍니다.
NAME은 이 페이지에서 설명하는 함수 목록이죠. 이 페이지 하나로 sqrt함수 삼총사를 한번에 다 설명하고 있죠.
SYNOPSIS는 간단 요약이죠. 함수 문법과 불러와야할 헤더파일, 라이브러리 목록을 알려주고 있죠.
ERRORS 는 함수가 실패하는 경우를 설명하는데 이것의 설명은 리턴값으로 저것을 전달한다는 것인지 전역변수 errno에 저장한다는 것인지가 불명확하네요. EDOM은 아마도 math.h 에 상수가 지정이 되어있을 겁니다.
그리고 여기에는 빠져있는데 RETURN 섹션도 있습니다. 함수 리턴값의 의미를 설명하는데 쓰입니다. sqrt는 리턴값의 의미가 너무 뻔해서 생략한 것 같습니다.
리눅스에서 프로그래밍하면 man 페이지 보실 일 많은 것입니다. 그래서 간략하게 man 페이지 보는법을 써 봤습니다.
=================
잠못자는 한솔아빠
갑사합니다. ^^
^^
댓글 달기