linux gcc編譯c文件頭文件
linux gcc編譯c文件頭文件,使用GCC編譯器編譯C語言
凶豬下山
轉載
關注
0點贊·1047人閱讀
GCC編譯C源代碼有四個步驟:預處理—->編譯—->匯編—->鏈接。
可以利用GCC的參數來控制執行的過程,這樣就可以更深入的了解編譯C程序的過程。
下面將通過對一個程序的編譯來演示整個過程。
#include
int main()
{
printf("happy new year!\n");
return 0;
}
1:預處理:編譯器將C程序的頭文件編譯進來,還有宏的替換,可以用gcc的參數-E來參看。
預處理 命令:gcc -E hello.c -o hello.i
作用:將hello.c預處理輸出hello.i
2:編譯:這個階段編譯器主要做詞法分析、語法分析、語義分析等,在檢查無錯誤後後,把代碼翻譯成匯編語言。可用gcc的參數-S來參看。
編譯器(ccl)將文本文件hello.i 翻譯成文本文件hello.s, 它包含一個匯編語言程序。匯編語言程序中的每條語句都以一種標準的文本格式描述了一條低級機器語言指令。
編譯命令:gcc -S hello.i -o hello.s
作用:將預處理輸出文件hello.i匯編成hello.s文件
3:匯編:把編譯階段生成的.s 文件轉換為二進制目標代碼。可用gcc的參數-c來參看。匯編器(as)將hello.s翻譯成機器語言指令,把這些指令打包成可重定位目標程序的格式, 並將結果保存在目標文件hello.o中。hello.o文件是一個二進制文件,它的位元組編碼是機器語言。
匯編 命令:gcc -c hello.s -o hello.o
作用:作用:將匯編輸出文件hello.s編譯輸出hello.o文件
4:鏈接:把obj文件鏈接為可執行的文件:鏈接器(ld)負責.o文件的並入。結果就是hello文件,它是一個課執行的目標文件,可以載入到存儲器後由系統調用。
鏈接命令:gcc hello.o -o hello
一步操作的話是: (-o必須在hello之前 )
$gcc hello.c -o hello
$./hello或者:(會默認生成a.out文件)
$gcc hello.c
$./a.out
『貳』 C語言,關於頭文件
編譯器會在鏈接時搜索參與鏈接的所有文件,b.c中的函數會被鏈接到a.c所需的位置(不需要頭文件也可)
『叄』 C++中類的頭文件和實現文件怎麼用
例如:有三個文件。名字分別是:a.h
,
a.cpp,
aTest.cpp
.
a.h就是類的頭文件。a.cpp是頭文件a.h中類的實現,它裡面要有
#include"a.h"
。
aTest.cpp是類的使用文件,在這個文件里你可以用這個類去完成它能完成的功能,在它裡面要有:
#include"a.h"
,但是不用
#include"a.cpp"
,,,,,,,,,,,
。在編譯a.h時,自動編譯了a.cpp。
『肆』 關於頭文件編譯
頭文件不能編譯,只能編譯源文件。
源文件預編譯的時候,如果碰到#include <xxx.h>,就把xxx.h中的文本內容全部復制到相應的位置
比如在
cpp中寫
int a[] = {
#include "a.h"
};
在"a.h"中寫
1, 2, 3, 4, 5
是合法的。
預編譯後就是
int a[] = {
1, 2, 3, 4, 5
};
你還可以試驗其他更古怪的#include方法。再結合#define去理解預編譯的意義。
『伍』 C#中如何使用頭文件(xxxx.h),以及如何將頭文件編譯成動態鏈接庫(DLL)
頭文件、cpp文件和dll文件之間的是這樣的關系:頭文件聲明方法,cpp實現方法、cpp編譯後得到dll,因此頭文件描述的是dll文件的介面,也就是具體實現的介面。如果你只有dll文件,只要知道其導出的方法就可以直接使用,win32有對應的api。如果想要將dll中的所有可用方法包含到項目中,就要包含頭文件。這就是說,頭文件和dll文件是對應的。另外,如果你的頭文件中已經包含了實現代碼,那你需要提供一個空的cpp文件,包含該頭文件,並將它們編譯成dll文件。
C#沒法直接用C++的頭文件,但是可以直接用dll,使用的技術稱作PInvoke,原理是在C#代碼中用extern關鍵字添加dll中所需方法的簽名,也就是二樓說的那種方法。此外,如果這個dll是採用com技術實現的,也可以使用.NET平台提供的COM互操作特性直接導入使用。
『陸』 編譯時怎麼使用.a文件
編譯時怎麼使用.a文件
for example:(1)動態庫的編譯
這里有一個頭文件:so_test.h,三個.c文件:test_a.c、test_b.c、test_c.c,我們將這幾個文件編譯成一個動態庫:libtest.so。
命令:$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
『柒』 linux下,C語言頭文件在哪
一、 C標准庫頭文件,以及Linux的標准庫文件的對應頭文件,默認放在/usr/include下。 如圖:
標識出了最常用的幾個頭文件。
二、 自定義頭文件,或者集成頭文件,需要在編譯的時候指定。可以在命令行中指定,也可以在makefile中指定。
指定自定義頭文件路徑方式為:
-IPATH1 -IPATH2...
如當前目錄下的inc文件夾,指定為頭文件, 那麼在編譯a.c時,可以命令寫作:
gcc a.c -I./inc -o a.out
『捌』 c++頭文件編譯重編譯
#ifndef XXXXX_H // 如果沒有定義 XXXXX_H
#defined XXXXX_H // 先定義 XXXXX_H , 那麼下一次編譯到這個 頭文件的時候上一句條件不成立,下面的內容就不會再編譯了。
// 頭文件中的代碼
#endif
在C++中,可以用#pragma once,用了#pragma once 之後就可以不用那麼麻煩去判斷有沒有編譯 過這個頭文件了,那個由編譯器自己判斷了。
『玖』 關於在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了。
『拾』 ios中怎麼調用a文件里的內容
ios中後綴名為a的文件是編譯好的二進制文件,一般是第三方為了保密代碼而使用的。a文件里邊的內容是沒法看懂的,只有配合.h頭文件,知道它有哪些暴露出來的屬性或者函數才能調用。調用方法和平時使用 .h .m 文件一樣,只是你看不見.m里邊的代碼而已。