問題來自鏈接器,ld
,而不是gcc(因此退出狀態消息)。通常,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 [email protected]@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 [email protected]@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 4.1.2和4.3.4 ... –
@OliCharlesworth我簡直複製粘貼顯然這一切,和它不適用於我 – puk
@OliCharlesworth是否有可能math.h不包含在內? – puk