1. 程式人生 > >Ubuntu gcc錯誤:對'log'等函數未定義的引用

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

obj can collect amp linux stdio.h math 但是 成功

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'等函數未定義的引用