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));
}
Ubuntu gcc編譯
直接命令gcc -Wall a.c
1 [email protected]:~$ 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 [email protected]:~$ gcc -Wall -c a.c 2 [email protected]:~$ 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 [email protected]:~$
編譯時沒有問題,鏈接生成可執行文件時報錯。接下來加上-lm。 鏈接成功,如下:
1 [email protected]:~$ gcc -Wall -o a a.o -lm 2 [email protected]:~$
註意1:-lm要加在編譯文件後面。
這個主要的原因是gcc
編譯的時候,各個文件依賴順序的問題。在gcc
編譯的時候,如果文件a
依賴於文件b
,那麽編譯的時候必須把a
放前面,b
放後面。
註意2:sqrt()函數也是<math.h>頭文件中的函數,但sqrt函數的使用沒有以上限制,即編譯時不加-lm也可以。
Linux升級GCC 4.8.1清晰簡明教程(Ubuntu 12.04 64位版為例) http://www.linuxidc.com/Linux/2014-04/99583.htm
Ubuntu 14.04 LST安裝GCC 4.1.2 http://www.linuxidc.com/Linux/2016-06/132040.htm
Ubuntu 16.04 下將GCC-5.4降級到 4.8 http://www.linuxidc.com/Linux/2017-07/145502.htm
CentOS6.5升級手動安裝GCC4.8.2 http://www.linuxidc.com/Linux/2015-01/112595.htm
Ubuntu升級GCC版本 http://www.linuxidc.com/Linux/2016-11/136840.htm
CentOS7環境下在/離線安裝GCC與GCC-C++ http://www.linuxidc.com/Linux/2017-03/142319.htm
Ubuntu 16.04 LTS 降級安裝GCC 4.8 http://www.linuxidc.com/Linux/2017-03/142299.htm
本文永久更新鏈接地址:http://www.linuxidc.com/Linux/2017-09/147168.htm
Ubuntu gcc錯誤:對'log'等函數未定義的引用