Ubuntu gcc錯誤:對'log'等函數未定義的引用


 

a.c 
1
#include <stdio.h> 2 #include <math.h> 3 int main() 4 { 5 float a; 6 void print_logarithm(double); 7 printf("enter a num:"); 8 scanf("%f",&a); 9 print_logarithm(a); 10 return 0; 11 } 12 void print_logarithm(double x) 13 { 14 if(x<=0.0) 15 { 16 printf("Positive numbers only,please.\n"); 17 return; 18 } 19 printf("The log of x is %f",log(x)); 20 }

Ubuntu gcc編譯

直接命令gcc -Wall a.c

1 tgs@tgs-VirtualBox:~$ gcc -Wall a.c
2 /tmp/ccmKjOLq.o:在函數‘print_logarithm’中:
3 a.c:(.text+0x97):對‘log’未定義的引用
4 collect2: error: ld returned 1 exit status

查了一下發現:主要是C/C++編譯為obj文件的時候並不需要函數的具體實現,只要有函數的原型即可。但是在鏈接為可執行文件的時候就必須要具體的實現了。驗證如下:

1 tgs@tgs-VirtualBox:~$ gcc -Wall -c a.c
2 tgs@tgs-VirtualBox:~$ gcc -Wall -o a a.o
3 a.o:在函數‘print_logarithm’中:
4 a.c:(.text+0x97):對‘log’未定義的引用
5 collect2: error: ld returned 1 exit status
6 tgs@tgs-VirtualBox:~$ 

編譯時沒有問題,鏈接生成可執行文件時報錯。接下來加上-lm。 鏈接成功,如下:

1 tgs@tgs-VirtualBox:~$ gcc -Wall -o a a.o -lm
2 tgs@tgs-VirtualBox:~$ 

注意1:-lm要加在編譯文件后面。

這個主要的原因是gcc編譯的時候,各個文件依賴順序的問題。gcc編譯的時候,如果文件a依賴於文件b,那么編譯的時候必須把a放前面,b放后面。

注意2:sqrt()函數也是<math.h>頭文件中的函數,但sqrt函數的使用沒有以上限制,即編譯時不加-lm也可以。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM