gcc는 수학을 제대로 포함하지 않습니다.h
여기 내 문제를 설명하는 최소한의 예가 있습니다.
test.c:
#include <stdio.h>
#include <math.h>
main ()
{
fmod ( 3, 2 );
}
여기에 내가 정리하기 위해 내리는 명령어가 있습니다.test.c
gcc -lm test.c -o test
그리고 여기 위 명령을 내릴 때 나오는 출력이 있습니다.
/tmp/ccQmRk99.o: In function `main':
test.c:(.text+0x3e): undefined reference to `fmod'
collect2: ld returned 1 exit status
대신 사용하면 동일한 출력이 나옵니다.cc
. 저는 다음 버전의 gcc를 사용하고 있습니다.
gcc-4.6.real (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
내 프로그램이 컴파일되지 않는 이유가 무엇입니까?
링커에서 문제가 발생하고 있습니다.ld
, gcc가 아니라(종료 상태 메시지를 hence합니다).일반적으로 ld는 개체와 라이브러리를 순서대로 지정해야 합니다.user
supplier
,어디에user
도서관 기능을 사용하는 물체와supplier
그것을 제공하는 대상입니다.
당신의test.c
컴파일러는 fmod가 정의되지 않은 참조라고 하는 개체로 컴파일됩니다.
$ gcc -c test.c
$ nm test.o
U fmod
0000000000000000 T main
(nm에는 개체 파일이 참조하는 모든 기능이 나열됩니다.)
링크러는 정의되지 않은 참조를 정의된 참조로 변경하여 다른 파일에 제공되는지 확인하기 위해 참조를 검색합니다.
$ gcc -lm test.o
$ nm a.out
0000000000600e30 d _DYNAMIC
0000000000600fe8 d _GLOBAL_OFFSET_TABLE_
00000000004006a8 R _IO_stdin_used
w _Jv_RegisterClasses
0000000000600e10 d __CTOR_END__
...
0000000000601018 D __dso_handle
w __gmon_start__
...
U __libc_start_main@@GLIBC_2.2.5
0000000000601020 A _edata
0000000000601030 A _end
0000000000400698 T _fini
0000000000400448 T _init
0000000000400490 T _start
00000000004004bc t call_gmon_start
0000000000601020 b completed.7382
0000000000601010 W data_start
0000000000601028 b dtor_idx.7384
U fmod@@GLIBC_2.2.5
0000000000400550 t frame_dummy
0000000000400574 T main
대부분은 환경을 설정하기 위해 메인 전후에 실행되는 libc 기능을 말합니다.이제 fmod가 glibc를 가리키며, 여기서 공유 라이브러리 시스템에 의해 해결됩니다.
내 시스템은 기본적으로 공유 라이브러리를 사용하도록 설정되어 있습니다.정적 링크를 강제로 연결하면 주문 의존성이 나타납니다.
$ gcc -static -lm test.o
test.o: In function `main':
test.c:(.text+0x40): undefined reference to `fmod'
collect2: ld returned 1 exit status
놓는 것-lm
링커 명령의 나중에, 다음에. test.o
, 링크를 성공적으로 수행할 수 있습니다.기호 fmod를 확인하는 것은 이제 실제 주소로 해결되어야 하며, 실제로 그렇게 됩니다.
$ gcc -static test.o -lm
$ nm a.out | grep fmod
0000000000400480 T __fmod
0000000000402b80 T __ieee754_fmod
0000000000400480 W fmod
gcc(1) manpage에서:"-l 옵션의 배치는 중요합니다."
구체적으로:
-llibrary -l library Search the library named library when linking. (The second alternative with the library as a separate argument is only for POSIX compliance and is not recommended.) It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o. If bar.o refers to functions in z, those functions may not be loaded. The linker searches a standard list of directories for the library, which is actually a file named liblibrary.a. The linker then uses this file as if it had been specified precisely by name. The directories searched include several standard system directories plus any that you specify with -L. Normally the files found this way are library files---archive files whose members are object files. The linker handles an archive file by scanning through it for members which define symbols that have so far been referenced but not defined. But if the file that is found is an ordinary object file, it is linked in the usual fashion. The only difference between using an -l option and specifying a file name is that -l surrounds library with lib and .a and searches several directories.
언급URL : https://stackoverflow.com/questions/11336477/gcc-will-not-properly-include-math-h
'source' 카테고리의 다른 글
python 스크립트가 실행 중인지 확인합니다. (0) | 2023.10.14 |
---|---|
두 번째 인수가 메인()인 char *argv[]와 char **argv의 차이 (0) | 2023.10.14 |
NSOperationQueue에서 모든 작업이 완료되면 알림 받기 (0) | 2023.10.14 |
NA만 포함된 열을 삭제하는 방법은 무엇입니까? (0) | 2023.10.14 |
Xcode 4.2 기본 설정인 "무선 연결 장치 지원"의 기능은 무엇입니까? (0) | 2023.10.14 |