2011-01-05 2 views
56

방금 ​​수학 라이브러리에서 함수를 참조하는 프로그램을 컴파일하기 위해 gcc가 -lm 플래그를 필요로한다는 것을 발견했습니다. 시간 라이브러리와 같은 다른 라이브러리를 포함하는 프로그램을 컴파일 할 때 명시 적 연결 플래그가 필요하지 않은 이유가 궁금합니다. time() 함수가 호출 된 프로그램을 작성하면 연결 옵션이 없어도 문제없이 컴파일됩니다. 그러나 수학 라이브러리가 포함 된 프로그램은 -lm 플래그가 없으면 작동하지 않습니다.gcc : 수학 라이브러리를 연결하는 데 -lm 플래그가 필요한 이유는 무엇입니까?

누구든지이 문제의 원인을 설명해주십시오. 시간 내 줘서 고마워. time() 및 다른 기능 자체와 GCC 항상 링크가 하지 않는과 libc C 라이브러리 (libc)에 정의 된 builtin을하기 때문에

+4

이상한 역사적 이유가 있지만 그 이유는 다음과 같습니다. http://stackoverflow.com/questions/1033898/why-do-you-have-to-link-the-math-library-in-c – birryree

답변

32

당신은 -ffreestanding 컴파일 옵션을 사용합니다. 그러나 수학 함수는 libm에 있으며 gcc에 암묵적으로 연결되어 있지 않습니다.

+4

On LLVM gcc -lm을 추가 할 필요가 없습니다. 왜 이런거야? –

55

누구도 고치려하지 않는 어리석은 역사적 관례 때문에. C와 POSIX가 요구하는 모든 기능을 하나의 라이브러리 파일에 통합하면이 질문을 반복해서받는 것을 피할 수있을뿐만 아니라 동적 연결시 많은 시간과 메모리를 절약 할 수 있습니다. 각 파일은 연결된 .so 파일 시스템이 필요하기 때문에 작업 (찾아 그것을 발견, 등 등의 정적 변수, 재배치,

모든 기능을 하나의 라이브러리에있는

구현과 -lm, -lpthread, -lrt위한 몇 페이지는 옵션이 전혀 작전 있습니다 없습니다 또는 빈 .a 파일에 대한 링크)는 완벽하게 POSIX를 준수하며 확실히 바람직합니다.

참고 : C 자체는 컴파일러의 호출 방법을 지정하지 않았기 때문에 POSIX에 대해 이야기하고 있습니다. 따라서 gcc -std=c99 -lm을 컴파일러가 준수 동작을 위해 호출해야하는 구현 관련 방식으로 처리 할 수 ​​있습니다.

+8

+1 POSIX에서는 분리 된 libm, libc 및 librt 라이브러리가 필요하지 않음을 지적합니다. 예를 들어 Mac OS에서는 모든 것이 단일 libSystem (libdbm, libdl, libgcc_s, libinfo, libm, libpoll, libproc 및 librpcsvc 포함)에 있습니다. –

+3

-1 링크 또는 숫자로 백업하지 않고 성능에 대한 라이브러리 조회 영향을 추측합니다. "프로필. 추측하지 마세요." –

+7

이것은 추측이 아닙니다. 나는 출판 된 논문이 없지만, 나는 모든 측정을 직접했고 그 차이는 엄청납니다. 타이밍 옵션 중 하나와 함께'strace'를 사용하여 동적 연결에 시작 시간이 얼마나 소요되는지 관찰하거나 모든 표준 유틸리티가 정적 링크 된 시스템과 동적 인 위치에서'./configure' 실행을 비교하십시오 - 링크 된. 주류 데스크톱 응용 프로그램 개발자 및 시스템 통합 자도 동적 연결 비용을 알고 있습니다. 이것이 바로 prelink와 같은 것들이 존재하는 이유입니다. 나는 그 논문들 중 일부에서 벤치 마크를 찾을 수있을 것이라고 확신한다. –

관련 문제