[英]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.