簡體   English   中英

gcc編譯和gcc -lm -Wall -o之間的區別?

[英]Difference between gcc compile and gcc -lm -Wall -o?

我正在為CS類做作業,我們需要為首次使用C開發一個簡單的程序。我能夠通過gcc編譯來創建該程序,但是在使用gcc -lm -Wall -o編譯時,我的程序崩潰並返回

Undefined symbols for architecture x86_64:
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

在第二次編譯時進入程序會導致我的程序崩潰?

要使用gcc編譯代碼,您還需要傳遞源文件的名稱。 因此,如果您有一個名為project1.c的源文件,則可以通過運行以下命令進行編譯:

gcc -lm -Wall -o a.out project1.c

假設您的代碼已成功編譯(沒有錯誤),則可以通過執行以下操作來運行它:

./a.out

話雖如此,您的代碼將無法編譯。 您不能對浮點數使用模運算符。

foo.c:9:25: error: invalid operands to binary expression ('float' and 'float')
    leftover= enrollment%25;
              ~~~~~~~~~~^~~

要了解gcc的命令行參數,可以使用

$ man gcc

該文檔非常艱巨,因為有很多選擇。 手冊頁的一些經驗將幫助您快速掃描所需的信息。

首先要看的是“概要”部分。 這顯示了gcc的用法。 []任何內容都是可選的。 請注意,在本節的最后,有infile... 這意味着您必須至少提供一個文件名供編譯器處理。 我懷疑您遇到了錯誤,因為您錯過了這個。

所以正確的命令行應該是

$ gcc -Wall -o <program> <program>.c -lm

這會將您的.c文件編譯為具有相同名稱但沒有擴展名的可執行文件。

有關您使用的選項的詳細信息,以下內容直接來自gcc手冊頁。

   -Wall

       This enables all the warnings about constructions that some users
       consider questionable, and that are easy to avoid (or modify to
       prevent the warning), even in conjunction with macros. 

   -llibrary
   -l library
       Search the library named library when linking.

   -o file
       Write output to file.  

您收到的錯誤歸因於-Wall選項。

-lm標志鏈接到名為“ m”的庫中。 這是一個數學庫,您現在可能不必擔心。 有關此庫的更多詳細信息,請使用man libm

請注意, -o選項需要一個參數。 在您的情況下,這告訴gcc要創建的可執行文件的名稱。 (這就是我上面建議的解決方案中-o <program>的原因。)

暫無
暫無

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

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