source

gcc는 수학을 제대로 포함하지 않습니다.h

ittop 2023. 10. 14. 10:36
반응형

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

반응형