當前位置:首頁 » 編程軟體 » linux下編譯含頭文件的程序

linux下編譯含頭文件的程序

發布時間: 2023-03-02 03:29:08

linux下編寫c++,include的那些頭文件在什麼地方

C/C++程序在linux下被編譯和連接時,GCC/G++會查找系統默認的include和link的路徑,以及自己在編譯命令中指定的路徑。

1、#include <stdio.h>,直接到系統指定目錄去查找頭文件。

系統默認路徑為:/usr/include,/usr/local/include,/usr/lib/gcc-lib/i386-Linux/2.95.2/include(gcc庫文件的路徑,各個系統不一致)

2、#include "stidio.h",會先到當前目錄查找頭文件,如果沒找到在到系統指定目錄查找。

3、gcc編譯時查找頭文件,按照以下路徑順序查找:

gcc編譯時,可以設置-I選項以指定頭文件的搜索路徑,如果指定多個路徑,則按照順序依次查找。比如,gcc -I /usr/local/include/node a.c

gcc會查找環境變數C_INCLUDE_PATH,CPLUS_INCLUDE_PATH中指定的路徑。

(1)linux下編譯含頭文件的程序擴展閱讀:

應用程序代碼編譯過程:

編譯器根據頭文件提供的庫函數介面形式,來編譯代碼,然後生成目標文件;然後,再使用鏈接器將這個目標文件與系統庫鏈接;最終生成應用程序。代碼包含了自己寫的內容,還有系統提供好的現成的庫函數,整個結合起來才形成一個完整的程序。

庫函數的頭文件,在編譯的時候被使用,而庫函數的代碼段(庫文件),在鏈接的時候被使用。

example:

應用程序代碼在使用一個系統調用的時候,例如printf()函數,需要指定包含的頭文件stdio.h;另外,在鏈接的時候對應的鏈接libc.a(筆者電腦文件所在目錄:/usr/lib/i386-linux-gnu/libc.a)。

總結一下,編寫應用程序,需要使用linux系統提供的庫函數。具體實現起來,需要頭文件和庫文件。頭文件是需要我們編寫應用程序的時候,在源文件開頭添加的;而庫文件則需要配置編譯環境進行指定搜索目錄。

Ⅱ 在linux中,怎麼用gcc編譯文件

在終端中輸入 gcc 文件名 -o 目標文件名
然後 ./目標文件名 就行了,沒有目標文件名,自動存為 a
執行 ./a 就行了。

在使用Gcc編譯器的時候,我們必須給出一系列必要的調用參數和文件名稱。GCC編譯器的調用參數大約有100多個,其中多數參數我們可能根本就用不到,這里只介紹其中最基本、最常用的參數。
GCC最基本的用法是∶gcc [options] [filenames]
其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。
-c,只編譯,不連接成為可執行文件,編譯器只是由輸入的.c等源代碼文件生成.o為後綴的目標文件,通常用於編譯不包含主程序的子程序文件。
-o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執行文件a.out。
-g,產生符號調試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。
-O,對程序進行優化編譯、連接,採用這個選項,整個源代碼會在編譯、連接過程中進行優化處理,這樣產生的可執行文件的執行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。
-O2,比-O更好的優化編譯、連接,當然整個編譯、連接過程會更慢。
-Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數。C程序中的頭文件包含兩種情況∶
A)#include <myinc.h>
B)#include 「myinc.h」
其中,A類使用尖括弧(< >),B類使用雙引號(「 」)。對於A類,預處理程序cpp在系統預設包含文件目錄(如/usr/include)中搜尋相應的文件,而B類,預處理程序在目標文件的文件夾內搜索相應文件。

GCC執行過程示例

示例代碼 a.c:
#include <stdio.h>
int main()
{
printf("hello\n");
}
預編譯過程:
這個過程處理宏定義和include,並做語法檢查。
可以看到預編譯後,代碼從5行擴展到了910行。
gcc -E a.c -o a.i
cat a.c | wc -l
5
cat a.i | wc -l
910
編譯過程:
這個階段,生成匯編代碼。
gcc -S a.i -o a.s
cat a.s | wc -l
59
匯編過程:
這個階段,生成目標代碼。
此過程生成ELF格式的目標代碼。
gcc -c a.s -o a.o
file a.o
a.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
鏈接過程:
鏈接過程。生成可執行代碼。鏈接分為兩種,一種是靜態鏈接,另外一種是動態鏈接。使用靜態鏈接的好處是,依賴的動態鏈接庫較少,對動態鏈接庫的版本不會很敏感,具有較好的兼容性;缺點是生成的程序比較大。使用動態鏈接的好處是,生成的程序比較小,佔用較少的內存。
gcc a.o -o a
程序運行:
./a
hello
編輯本段
GCC編譯簡單例子

編寫如下代碼:
#include <stdio.h>
int main()
{
printf("hello,world!\n");
}
執行情況如下:
gcc -E hello.c -o hello.i
gcc -S hello.i -o hello.s
gcc -c hello.s -o hello.o
gcc hello.c -o hello
./hello
hello,world!

Ⅲ 如何在linux shell中同時編譯一個源文件和一個頭文件,使其生成一個可執行文件

直接用gcc編譯.c文件,.c文件中 #include "頭文件" 即可。
gcc test.c -o output -Wall
其中,output為輸出的可執行文件,-Wall開關用於顯示所有警告信息。

Ⅳ 關於在linux下用gcc編譯頭文件

首先,確定你的頭文件都用宏隔開了,防止了重復定義。例如,在file.h 中的開頭就是
#ifndef __FILE__HEAD___
#define __FILE__HEAD___
//頭文件中的內容
#endif //__FILE__HEAD___
之後,
file.h中用到了list.h ,所以file.h中#include "list.h"//假設頭文件都在同一目錄下
list.h中用到了preapre.h 所以list.h中#include "prepare.h"
prepare.h中用到了node.h 所以prepare.h中#include "node.h"

在某些情況下,由於代碼組織等的問題,還是會出現編譯問題,這個就是代碼組織技巧的問題了,要根據具體代碼具體判斷了。
另外,准確的說頭文件只是在編譯的第一步,預處理的時候使用了,真正被「編」的應該是源文件,這個是編譯原理方面的問題了。

Ⅳ 急!LINUX下,GCC編譯,原程序包含<semaphore.h>頭文件,為什麼編譯時說sem_wait,sem_post等未定義的引用

編譯時加上參數:-lpthread

要看報錯的階段,是在編譯還是鏈接階段.
如果編譯時函數沒有找到,那是頭文件的問題,如果鏈接時未定義引用,那是c庫的問題.
如果你的頭文件都正常包含了,那可能你的c庫沒有使能semaphore的支持.

Ⅵ 關於在linux下用gcc編譯頭文件的問題。

我用一個例子來告訴你怎麼樣在 C++ 里使用C的頭文件/函數。

比方說我有一個C的頭文件叫 c.h, C的源碼文件叫 c.c,內容分別是

c.h:
#ifndef _ASDFD_INCLUDED_
#define _ASDFD_INCLUDED_

#include <stdio.h>

extern int test(int a);

#endif

c.c:
#include "c.h"

int test(int a)
{
printf("A = %d\n", a);
return a*a;
}

現在我想在c++中使用c.c中提供的函數test(),我的c++文件名字叫 a.cpp,那麼裡面跟C有關的部分就要用 extern "C" {} 大括弧括起來,看看我的
a.cpp:
#include <iostream>
using namespace std;

extern "C"
{
#include "c.h"
}

int main()
{
int b = 12;

b = test(b);

cout<<"b = "<<b<<endl;
return 0;
}

看到了吧,#include "c.h" 被 extern "C" {}括起來了。

然後是如何編譯,先把C文件編出目標文件(.o)來
gcc -c c.c
你會看到生成了 c.o,其實,有目標文件就夠了,如果你一定要做成(靜態/動態)庫文件,也是可以的,不過我這里就不深入了,做成庫和直接用目標文件對解決你的問題沒有任何區別。

然後再編譯C++文件,也就是我的 a.cpp
g++ -o hello a.cpp c.o
看到了吧,我在編譯 a.cpp 的時候把C生成的 c.o也加上了。 然後生成 可執行的 hello, 運行
./hello
就可以看到
A = 12
b = 144

關於創建靜態庫,假定你有3個C文件, a.c, b.c, c.c 提供了你C++要用到的介面,那麼可以把這三個C文件編譯出來的目標文件放到一個庫文件里供C++使用,方法為

先編譯出目標文件
gcc -c a.c b.c c.c

這時候你應該看到有 a.o b.o c.o了

然後創建庫文件
ar cr libtest.a a.o b.o c.o
這三個目標文件就放入 libtest.a 這個靜態庫中了,然後編譯C++程序 (你的C++程序應該已經按照我前面說的用 extern "C" 把C的介面都括起來了),假定你的 libtest.a 放在 /home/aaa/lib下

g++ -o my.exe my.cpp -L/home/aaa/lib -ltest

就會生成可執行文件 my.exe了。

Ⅶ Linux下使用gcc編譯及運行C程序的方法

gcc main.c max.c -o 程序名
或者先編譯成obj:
gcc main.c -c -o main.o
gcc max.c -c -o max.o
gcc max.o main.o -o 程序名

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:743
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:1007
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:713
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:875
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:774
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1122
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:347
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:225
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:911
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:871