2017-10-13 11 views
1

현재 uni asssessment 용 프로그램을 작성 중이며 컴파일 할 설정 라인이 있으므로 작동하지 않으면 허용되지 않습니다. 그들은 그들이 사용하는 명령 이다-lm 명령의 끝 부분에 있지 않으면 작동하지 않습니다.

gcc -Wall -ansi -lm program.c -o program.out 

을 (math.h 라이브러리를 사용하여 내 LOG10 참조) 내가 사용하는 경우 내 프로그램은 그런 식으로 컴파일되지 않습니다, 그것은 나에게 정의되지 않은 referance에 오류를주지 :

gcc -Wall -ansi program.c -o program.out -lm 

작동합니다.

문제점은 무엇입니까?

Windows 10 64bit를 사용하고 windows bash가 설치되어 있고 gcc가 있습니다.

+0

GCC의 compliler의 버전은 무엇입니까? –

+0

이것은 최소한 GCC가 항상 나를 위해 행동 한 방식과 일치합니다. - 주어진 컴파일 단위 (예 :'program.c'에서 생성 된 객체 파일)의 이름을 나중에 컴파일 유닛의 주소 (' libm.a' 또는 Windows에서 'm.lib'이 될 것인가?). 그래서 여러분의 대학에서는 컴파일이 소스 파일 앞에서'-lm'을 사용하기를 기대합니다. –

+0

gcc를 사용하는 사람 5.4.0! 그래,하지만 같은 일이지만, 어떻게해야할지 모르겠다. – Paloking

답변

0

-lm은 명령 끝 부분에 있어야하며 대부분 첫 번째 경우에는 컴파일러가 function에 대한 호출을 최적화하므로 라이브러리에 링크 할 필요가 없습니다. 이 constant folding라고 말한다 예를 들어 우리는 Other Built-in Functions Provided by GCCgcc 문서에서 볼 수 있습니다

GCC가 내장 포함 표준 C 라이브러리의 많은 기능의 버전. 접두사가 __builtin_ 인 접두사는 으로, 에 -fno-builtin 옵션을 지정해도 C 라이브러리 함수와 동일한 의미로 취급됩니다. (C Dialect Options 참조) 많은 경우 이러한 함수는 특정 경우에만 최적화됩니다. 특정 경우에 이 최적화되어 있지 않으면 라이브러리 함수를 호출하면 이 출력됩니다.

2

강사가 금을 사용 중이며 GNU ld를 사용하고있는 경우에 설명됩니다. 이것들은 두 개의 링커이며, 둘다 GNU 프로젝트의 일부이며, 둘 다 GCC에서 일반적으로 사용됩니다.

는 GNU의 LD를 사용하는 경우, 당신은 "전통적인"동작을 얻을 :

에 -l 및 -l 옵션 및 경로 이름 피연산자에 대한 -l 옵션을 지정하는 순서를 지정하는 순서 중요하다.

는 후 종속 된 오브젝트 파일 및 라이브러리를 -lm 을 넣어야 할 것을 의미한다.

그러나 금을 사용하는 경우 -l 옵션이 먼저 나타날 수 있습니다.

금이 시스템에 설치된 경우 직접 테스트 할 수 있습니다.

$ gcc -lm program.c 
/tmp/ccJmBjmd.o: In function `main': 
program.c:(.text+0x15): undefined reference to `sin' 
collect2: error: ld returned 1 exit status 

하지만 금을 사용하는 경우, 그것을 잘 작동합니다 : 여기

내가 얻을 무엇

$ gcc -lm program.c -fuse-ld=gold