《LINUX教學:Ubuntu gcc錯誤:對'log'等函數未定義的引用》要點:
本文介紹了LINUX教學:Ubuntu gcc錯誤:對'log'等函數未定義的引用,希望對您有用。如果有疑問,可以聯系我們。
Ubuntu gcc差錯:對'log'等函數未定義的引用
a.c
#include <stdio.h>
#include <math.h>
int main()
{
? ? float a;
? ? void print_logarithm(double);
? ? printf("enter a num:");
? ? scanf("%f",&a);
? ? print_logarithm(a);
? ? return 0;
}
void print_logarithm(double x)
{
? ? if(x<=0.0)
? ? {
? ? ? ? printf("Positive numbers only,please.\n");
? ? ? ? return;
? ? }
? ? printf("The log of x is %f",log(x));
}
直接敕令gcc -Wall a.c
1 linuxidc.com@linuxidc:~$ 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 linuxidc.com@linuxidc:~$ gcc -Wall -c a.c 2 linuxidc.com@linuxidc:~$ 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 linuxidc.com@linuxidc:~$
編譯時沒有問題,鏈接生成可執行文件時報錯.接下來加上-lm.?鏈接勝利,如下:
1 linuxidc.com@linuxidc:~$ gcc -Wall -o a a.o -lm 2 linuxidc.com@linuxidc:~$
注意1:-lm要加在編譯文件后面.
這個主要的原因是gcc
編譯的時候,各個文件依賴順序的問題.在gcc
編譯的時候,如果文件a
依賴于文件b
,那么編譯的時候必需把a
放前面,b
放后面.
注意2:sqrt()函數也是<math.h>頭文件中的函數,但sqrt函數的使用沒有以上限定,即編譯時不加-lm也可以.
Linux升級GCC 4.8.1清楚簡明教程(Ubuntu 12.04 64位版為例)? 9583.htm?
Ubuntu 14.04 LST安裝GCC 4.1.2? 32040.htm
Ubuntu 16.04 下將GCC-5.4降級到 4.8? 45502.htm
CentOS6.5進級手動安裝GCC4.8.2? 12595.htm?
Ubuntu進級GCC版本 36840.htm
CentOS7情況下在/離線安裝GCC與GCC-C++? 42319.htm
Ubuntu 16.04 LTS 降級安裝GCC 4.8? 42299.htm
本文永遠更新鏈接地址:47168.htm
更多LINUX教程,盡在維易PHP學院專欄。歡迎交流!
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/6551.html