簡體   English   中英

與 gcc 和 -lm 的鏈接不會在 Ubuntu 上定義 ceil()

[英]Linking with gcc and -lm doesn't define ceil() on Ubuntu

我目前正在使用 gcc 進行編譯,我需要使用<math.h> 問題是它無法識別圖書館。 我也試過-lm並沒有。 我嘗試使用的函數是ceil()並且出現以下錯誤:

: undefined reference to `ceil'
collect2: ld returned 1 exit status

我正在使用最新的 Ubuntu 並且 math.h 在那里。 我嘗試在另一台計算機上使用-lm並且它運行良好。

有誰知道如何解決這個問題?


我確實包括了<math.h> 另外,我使用的命令是:

gcc -lm -o fb file.c

獲取此代碼並將其放入文件ceil.c

#include <math.h>
#include <stdio.h>
int main(void)
{
    printf("%f\n", ceil(1.2));
    return 0;
}

編譯它:

$ gcc -o ceil ceil.c
$ gcc -o ceil ceil.c -lm

這兩個中的一個應該可以工作。 如果兩者都不起作用,則顯示每個編譯的完整錯誤消息。 請注意, -lm出現在源文件(或目標文件,如果在鏈接之前將源編譯為目標文件)的名稱之后。

筆記:

  1. 現代編譯器可能會優化代碼以將 2.0 直接傳遞給printf()而在運行時根本不調用ceil() ,因此根本不需要數學庫。

  2. 經驗法則:在庫之前在命令行上列出目標文件和源文件。 這個答案表明在使用中: -lm出現在源文件ceil.c 如果您使用make等構建,那么您通常在命令行上使用ceil.o (以及其他目標文件); 通常,您應該在任何庫之前列出所有目標文件。

經驗法則偶爾會有例外,但它們很少見,並且會針對預期/需要例外的特定情況進行記錄。 如果沒有相反的明確文件,請應用經驗法則。

只是想提一下 Peter van der Linden 的書Expert C Programming在第 5 章Thinking of Linking 中對這個主題有很好的處理。

檔案(靜態庫)的作用不同於共享對象(動態庫)。 對於動態庫,所有庫符號都進入輸出文件的虛擬地址空間,並且所有符號都可用於鏈接中的所有其他文件。 相比之下,靜態鏈接只在檔案中查找加載器在處理檔案時當前已知的未定義符號。

如果您在目標文件之前指定數學庫(通常是靜態庫),則鏈接器將不會添加任何符號。

嘗試這樣編譯:

gcc -Wall -g file.c -lm -o file

我遇到了同樣的問題,使用此命令解決了。 此外,如果您在遇到問題的同一天安裝了 Ubuntu,則可能是更新問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM