gcc編譯c程序(gcc使用)


下好下面一段簡單的代碼:

 

#include<stdio.h>
int main()
{
   printf("linux! hello world");

}

用ide寫好代碼保存為hello.c

用gcc首先要找到該文件。

 linux改變/顯示當前工作目錄

     cd(Change Directory)

 

語法:cd [-L|-P] [dir]

功能:cd(Change Directory),改變當前工作目錄。

常見用法:

1.     cd
切換至用戶主目錄,環境變量$HOME保存着當前登錄用戶的主目錄,也可以這樣用:cd $HOME      

2.     cd ~
同上。

3.     cd ~username
上面12命令僅能夠切換到當前登錄用戶的主目錄中,而
cd ~username
可以切換至當前未登錄用戶username的主目錄,其中username為系統中相應的用戶名,但只有root用戶可以這樣做。

 

4.     cd ..
切換至當前工作目錄的上一層目錄,即當前工作目錄的父目錄。

5.  cd -  cd $OLDPWD
    
這兩個命令的作用是一樣的,都是切換至前一個工作目錄。

我在root目錄下建立一個labs文件下,在labs下又建立了一個folder2文件夾。root/labs/folder2.操作顯示如下:

 

[root@jszx ~]# cd 
[root@jszx ~]# cd labs/folder2
[root@jszx folder2]# cd
[root@jszx ~]#

注意上面的意思:root@jszx顯示用戶,用戶名后面的代表當前目錄。~代表根目錄,

[root@jszx ~]# cd labs/folder2
[root@jszx folder2]# cd ..
[root@jszx labs]#
cd ..返回上一層目錄。也可以寫作cd ../

參考:

http://www.233.com/linux/fudao/20090802/092631173.html

 

編譯成目標文件

gcc  -o  hello  hello.c

或 gcc hello.c -o hello

生成的目標文件名(不是object,而是可執行文件)通過 -o 選項指定的。該選項通常作為命令行中的最后一個參數。如果被省略,輸出文件默認為 ‘a.out’。

 

 

注意到如果當前目錄中與可執行文件重名的文件已經存在,它將被覆蓋。

 

選項 -Wall 開啟編譯器幾乎所有常用的警告──強烈建議你始終使用該選項。編譯器有很多其他的警告選項,但 -Wall 是最常用的。默認情況下GCC 不會產生任何警告信息。當編寫 C 或 C++ 程序時編譯器警告非常有助於檢測程序存在的問題。 注意如果有用到math.h庫等非gcc默認調用的標准庫,請使用-lm參數

 

本例中,編譯器使用了 -Wall 選項而沒產生任何警告,因為示例程序是完全合法的。

 

選項 ""-g"" 表示在生成的目標文件中帶調試信息,調試信息可以在程序異常中止產生core后,幫助分析錯誤產生的源頭,包括產生錯誤的文件名和行號等非常多有用的信息。

 

要運行該程序,輸入可執行文件的路徑如下:

 

$ ./hello
Hello, world!

 

這將可執行文件載入內存,並使 CPU 開始執行其包含的指令。 路徑 ./ 指代當前目錄(不能省略),因此 ./hello 載入並執行當前目錄下的可執行文件 ‘hello’。

# gcc -o hello hello.c

# ./hello

linux! hello world

 

開啟warning.

如上所述,當用 C 或 C++ 編程時,編譯器警告是非常重要的助手。為了說明這一點,下面的例子包含一個微妙的錯誤:為一個整數值錯誤地指定了一浮點數控制符‘%f’。

#include <stdio.h>
 
int main (void)
{
printf ("Two plus two is %f\n", 4);
return 0;
}

一眼看去該錯誤並不明顯,但是它可被編譯器捕捉到,只要啟用了警告選項 -Wall

編譯上面的程序‘bad.c’,將得到如下的消息:

$ gcc -Wall -o bad bad.c
main.c: 在函數‘main’中:
main.c:5: 警告: 格式‘%f’需要類型‘double’,但實參 2 的類型為‘int’


這表明文件 ‘bad.c’第 6 行中的格式字符串用法不正確。GCC 的消息總是具有下面的格式 文件名:行號:消息。編譯器對錯誤與警告區別對待,前者將阻止編譯,后者表明可能存在的問題但並不阻止程序編譯。

本例中,對整數值來說,正確的格式控制符應該是 %d

如果不啟用 -Wall,程序表面看起來編譯正常,但是會產生不正確的結果:

$ gcc bad.c -o bad
$ ./bad
Two plus two is 0.000000

顯而易見,開發程序時不檢查警告是非常危險的。如果有函數使用不當,將可能導致程序崩潰或產生錯誤的結果。開啟編譯器警告選項 -Wall 可捕捉 C 編程時的多數常見錯誤。

多個源文件生成可執行程序

 

即使多個源碼文件被編譯,GCC編譯器也會自動進行鏈接操作。例如:下面的代碼保存在名為 hellomain.c 的文件中並調用一個名為 sayhello()的函數:

 

/* hellomain.c */
void sayhello(void);
int main(int argc,char *argv[])
{
sayhello();
return 0;
}

 

以下代碼保存在名為 sayhello.c 的文件中並定義了 sayhello() 函數:

 

/* sayhello.c */
#include <stdio.h>
void sayhello()
{
printf("hello, ubuntu\n");/*這里有個小錯誤,是中文輸入法造成的引號使gcc報錯*/
}

 

下面的命令將兩個文件分別編譯為對象文件且將其鏈接為可執行程序 hello,並刪除對象文件:

$ gcc -Wall hellomain.c sayhello.c -o helloubuntu

gcc ./helloubuntu

輸出了 hello,ubuntu

 

包含頭文件

 

linux 下開發軟件時,完全不使用第三方函數庫的情況是比較少見的,通常來講都需要借助一個或多個函數庫的支持才能夠完成相應的功能。從程序員的角度看,函數庫實際上就是一些頭文件( .h )和庫文件( .so 或者 .a )的集合。雖然 Linux 下的大多數函數都默認將頭文件放到/usr/include/ 目錄下,而庫文件則放到 /usr/lib/ 目錄下,但並不是所有的情況都是這樣。正因如此, GCC 在編譯時必須有自己的辦法來查找所需要的頭文件和庫文件。 GCC 采用搜索目錄的辦法來查找所需要的文件, -I 選項可以向 GCC 的頭文件搜索路徑中添加新的目錄。例如,如果在/home/justin/include/ 目錄下有編譯時所需要的頭文件,為了讓 GCC 能夠順利地找到它們,就可以使用 -I 選項:

# gcc foo.c -I /home/justin/include -o foo

在root/header下建立了一個文件header.h

#include<stdio.h>
void sayhello()
{
  printf("hello ubuntu\n");
}

在root/labs建立了一個c文件headerTest.c:

#include"header.h"
int main(int argc,char* argv[])
{
   sayhello();
return 0;
}

 

編譯如下:

 

[root@jszx labs]# gcc -I /root/header headerTest.c -o headerTestResult
在包含自 headerTest.c:1 的文件中:
/root/header/header.h:5:2: 警告:文件未以空白行結束
headerTest.c:6:2: 警告:文件未以空白行結束
[root@jszx labs]# ./headerTestResult
hello ubuntu
 正確輸出了結果。

 

頭文件和源文件會單獨存放在不同的目錄中。例如,假設存放源文件的子目錄名為./src,而包含文件則放在層次的其他目錄下,如./inc。當我們在./src 目錄下進行編譯工作時,如何告訴GCC到哪里找頭文件呢?方法如下所示: $ gcc test.c –I../inc -o test [喝小酒的網摘]http://blog.const.net.cn/a/17086.htm
上面的命令告訴GCC包含文件存放在./inc 目錄下,在當前目錄的上一級。
如果在編譯時需要 的包含文件存 放在多個目錄下,可以使用多個-I 來指定各個目錄:
$ gcc test.c –I../inc –I../../inc2 -o test 

這里指出了另一個包含子目錄inc2,較之前目錄它還要在再上兩級才能找到。

[喝小酒的網摘]http://blog.const.net.cn/a/17086.htm

 

 一個困惑我的問題:

例如:
//test.h
int fun ();

//test.c
int fun () {
//****
}

//main.c
#include <stdio.h>
#include "test.h"

int main ()
{
fun ();
return 0;
}
如果直接這樣用gcc -Wall main.c 編譯就會顯示:undefine reference to "fun"。
如果在main.c中包含上test.c文件就沒問題。但這種事情不會出現在VC之上。
用什么辦法才能只需要包含頭文件即可編譯呢?

你這樣的命令test.o沒有鏈接進去啊,把test.c加在后面
追問
有什么辦法能讓它自行查找並編譯test.c呢?
回答
沒有,一般的辦法是用makefile,把需要編譯的參數,文件都包含在里面,在VC里其實也是這樣的,不過VC里面自動生成了makefile
追問
看來只能自己寫makefile了。這些東西真是麻煩。
這個問題是http://zhidao.baidu.com/link?url=Tqp3uGEWxONqoaRlgLGArYT-88eoBrjflTBR-0kKCA6cOJxuvzrgKBCq-Ybdxj515j21lBFyox-efD9AkeLAQK

上面這個問題:還可以這么做,即使main.c不包含test文件,我們編譯的時候gcc -o x main.c test.c這樣也行。

 

 

參考:

http://www.cnblogs.com/azraelly/archive/2012/07/07/2580839.html

http://blog.renren.com/share/241565115/1819139547

http://blog.csdn.net/sustzombie/article/details/5470425

http://blog.csdn.net/sustzombie/article/details/5470425

 http://www.jhmcu.com/index.php/on-the-learning-experiences-of-computer-language/
http://blog.csdn.net/jk198310/article/details/16982735

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM