c編譯庫文件
開發C程序有四個步驟:編輯、編譯、連接和運行。
任何一個體系結構處理器上都可以使用C語言程序,只要該體系結構處理器有相應的C語言編譯器和庫,那麼C源代碼就可以編譯並連接到目標二進制文件上運行。
1、預處理:導入源程序並保存(C文件)。
2、編譯:將源程序轉換為目標文件(Obj文件)。
3、鏈接:將目標文件生成為可執行文件(EXE文件)。
4、運行:執行,獲取運行結果的EXE文件。
(1)c編譯庫文件擴展閱讀:
將C語言代碼分為程序的幾個階段:
1、首先,源代碼文件測試。以及相關的頭文件,比如stdio。H、由預處理器CPP預處理為.I文件。預編譯的。文件不包含任何宏定義,因為所有宏都已展開,並且包含的文件已插入。我歸檔。
2、編譯過程是對預處理文件進行詞法分析、語法分析、語義分析和優化,生成相應的匯編代碼文件。這個過程往往是整個程序的核心部分,也是最復雜的部分之一。
3、匯編程序不直接輸出可執行文件,而是輸出目標文件。匯編程序可以調用LD來生成可以運行的可執行程序。也就是說,您需要鏈接大量的文件才能獲得「a.out」,即最終的可執行文件。
4、在鏈接過程中,需要重新調整其他目標文件中定義的函數調用指令,而其他目標文件中定義的變數也存在同樣的問題。
❷ C語言 庫文件與頭文件有什麼區別
庫文件:是C已經封裝好的一些基本演算法功能。你只需引入相應庫文件的頭文件,調用庫文件的函數介面就可以實現相應的功能。
頭文件:你調用庫文件里的函數就的調入相應的頭文件.而且頭文件你也可以自己定義。
簡單說,頭文件可以是庫文件,也可以自己定義
❸ c腳本在不同系統中編譯和鏈接依賴的庫文件有何區別
問題1,
區別很大,跨OS編譯的區別就在於OS的本質區別,有一下幾點:
a, 位元組排序,一個int型的數據在windows里是由高地址存到低地址的4個位元組的(假設是32位機器),但是在某些UNIX伺服器,如AIX,它的排序方式就相反的,所以當程序被編譯成低級語言(例如匯編)的時候,內存及CPU的處理就會截然相反
b, 字長,有些unix伺服器是64位的,但大多WINDOWS是32位,那麼定義一個整形的時候就有用8個位元組和4個位元組的區別,字長不一樣,那麼執行起來用對內存的使用也自然就不一樣咯。
c,所謂的庫,也是由編譯器編譯出來的,在不同的OS下,由同一個代碼編譯出來的庫也會不一樣。
d,編譯器也各不相同,也會導致編譯出程序不完全相同。
e,所謂的調用,也就是將程序和庫一起打包,然後在找到庫裡面所定義的函數罷了
綜上,當一個程序或者庫要從其他OS搬到另一個不同規格的OS上的時候,一定要重新編譯一下草能確保程序跑起來不發生錯誤,求其原因也就是因為OS的本質區別,兼容的話,其實就是看OS是否在規格上有沒有本質區別
二,庫文件的編譯是單向的,所以無法取回源碼,
.a庫的打包例: ar r libabc.a a.o b.o c.o
將a.o b.o c.o 合並打包成libabc.a。注意哦(.a一定要以lib開始.a結束哦)
WIN下我不是很在行,你說的lib大包應該沒錯。
三,我不是很清楚
希望對你有幫助,我2年工作的精華
❹ C語言程序怎麼編譯成dll文件供其他語言調用
C程序編譯成dll文件只不過是在要公開的介面函數聲明前面加上幾個特定的修飾符而已。
下面是個例子,用dev-cpp建了個dll的默認文檔
/*dll.h文件*/
#ifndef _DLL_H_
#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
DLLIMPORT void HelloWorld (void);
#endif /* _DLL_H_ */
/*dllmain.c文件*/
/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
DLLIMPORT void HelloWorld ()
{
MessageBox (0, "Hello World from DLL!/n", "Hi", MB_ICONINFORMATION);
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
/* Returns TRUE on success, FALSE on failure */
return TRUE;
}
具體請參考jilei08124的CSDN博客
❺ 有個 c 文件,如何才能將其編譯成動態鏈接庫
有二個文件,一個 test.h, 一個 test.c
//test.h
#pragmaonce
#ifdef__cplusplus
extern"C"{
#endif
intadd(inta,intb);
#ifdef__cplusplus
}
#endif
//test.c
#include"test.h"
intadd(inta,intb)
{
returna+b;
}
編譯,生成動態鏈接庫:
#gcc-g3-Wall-fPIC-shared-olibtest.sotest.c
#ls-l
-rwxr-xr-x1rootroot14618Jul2413:44libtest.so
-rw-r--r--1rootroot63Jul2413:43test.c
-rw-r--r--1rootroot106Jul2413:43test.h
#nmlibtest.so
00000000002006e8a_DYNAMIC
0000000000200890a_GLOBAL_OFFSET_TABLE_
w_ITM_deregisterTMCloneTable
w_ITM_registerTMCloneTable
w_Jv_RegisterClasses
00000000002006c8d__CTOR_END__
00000000002006c0d__CTOR_LIST__
00000000002006d8d__DTOR_END__
00000000002006d0d__DTOR_LIST__
00000000000006b8r__FRAME_END__
00000000002006e0d__JCR_END__
00000000002006e0d__JCR_LIST__
00000000002008b8d__TMC_END__
00000000002008b8A__bss_start
w__cxa_finalize@@GLIBC_2.2.5
0000000000000620t__do_global_ctors_aux
0000000000000550t__do_global_dtors_aux
00000000002008b0d__dso_handle
w__gmon_start__
00000000002008b8A_edata
00000000002008c8A_end
0000000000000658T_fini
0000000000000468T_init
0000000000000600Tadd
00000000000004a0tcall_gmon_start
00000000002008b8bcompleted.6557
00000000000004c0tderegister_tm_clones
00000000002008c0bdtor_idx.6559
00000000000005d0tframe_mmy
0000000000000500tregister_tm_clones
❻ C語言程序編譯後產生哪些類型的文件這些文件的作用是什麼
不同的系統,產生的文件不一樣;
win:
->.obj目標文件
->.obj目標文件->.exe可執行文件
->.rc
。。。。
❼ C語言如何生成庫文件
有一些代碼,我們編程時經常用到,或者我們對某些部分很熟悉,並寫出了一些可用的介面。這時,我們會考慮把這些c文件做成一個lib庫,以方便自己使用,或這給別人調用。
我這里介紹下在vc++6.0下如何來製作靜態庫:
第一步:創建一個工程,選擇Win32Static
Library,輸入工程名。這時就創建好了。
第二步:工程創建好了,再點擊新建,這時選擇文件,選擇c++
source
file選項,創建一個.c
文件。
在這個文件中,你可以寫入你要做成庫的c函數。當然,可以繼續創建其他c文件,然後將要供外部使用的介面單獨放到頭文件中,一般而言,一個c文件對應一個頭文件。
第三步:完成以上步驟後,我們就可以生成庫了。事實上,我們點擊編譯即可,這時就可以生成.lib文件了。
一般情況下,是可以正常生成lib文件的。有頭文件和lib文件就可以給別人用了。然後我們可以寫一個測試函數來試試可不可以使用。
要調用生成的lib中的函數,就要引入頭函數。這時,你把lib和頭文件放入當前工程中,但build的時候卻顯示了連接錯誤。那是因為你沒有把lib文件包含進來。加入下面這句話即可了:
#pragma
comment(lib,
"mylib.lib
")
Ok,自己的lib庫就這樣做成了。以後可以隨便調用了
❽ c語言中多個文件的編譯問題
第一個問題
請問,我是不是該這樣做:
在main.c中#include
在fun.c中同樣#include
(好像是必需的,請詳細解釋)
這是必需的。因為編譯器只是把包含文件的代碼復制過來,既然你二個文件中都用到頭文件的內容,那當然要包含頭文件,否則就會出錯。
我的觀點,如果這兩步都是必需的
那麼當有很多個比如10個.c程序每個里頭都要#include
那麼文件是不是會特別大,當有100個.c程序都要包含一下的話,那麼不是非常重復么?)
那當然是會重復的。不過這個對程序的運行效率沒任何影響,只是在編譯過程中對文件的分析時間會稍長些,這也是沒有辦法的事,全看代碼編寫者如何組織結構了。
第二個問題:
會的。解決的方法就是在可能被多次包含的頭文件中開頭加上#pragma
once,那樣就可以保證此頭文件代碼只被執行一次,而不會造成頭文件中函數多次重復定義至於引起這種情況的情況。當然你也可以自己用#ifdef等預編譯處理來解決。你問的問題不就是這種情況么?main.c和fun.c中都包含頭文件tou.h
第三個問題:
當我在main.c中這樣
#define
unchar
unsigned
char
那麼當我在fun.c中還需要重新創建替換宏unchar嗎
可以不在創建而直接使用嗎?
答案是需重新創建,不能直接使用。但你可以把一些在多個文件中使用的宏、全局變數等統一定義到一個頭文件中,那這樣就可以避免多次定義了。
❾ C語言如何生成庫文件
有一些代碼,我們編程時經常用到,或者我們對某些部分很熟悉,並寫出了一些可用的介面。這時,我們會考慮把這些c文件做成一個lib庫,以方便自己使用,或這給別人調用。
我這里介紹下在vc++6.0下如何來製作靜態庫:
第一步:創建一個工程,選擇Win32Static Library,輸入工程名。這時就創建好了。
第二步:工程創建好了,再點擊新建,這時選擇文件,選擇c++ source file選項,創建一個.c
文件。
在這個文件中,你可以寫入你要做成庫的c函數。當然,可以繼續創建其他c文件,然後將要供外部使用的介面單獨放到頭文件中,一般而言,一個c文件對應一個頭文件。
第三步:完成以上步驟後,我們就可以生成庫了。事實上,我們點擊編譯即可,這時就可以生成.lib文件了。
一般情況下,是可以正常生成lib文件的。有頭文件和lib文件就可以給別人用了。然後我們可以寫一個測試函數來試試可不可以使用。
要調用生成的lib中的函數,就要引入頭函數。這時,你把lib和頭文件放入當前工程中,但build的時候卻顯示了連接錯誤。那是因為你沒有把lib文件包含進來。加入下面這句話即可了:
#pragma comment(lib, "mylib.lib ")
Ok,自己的lib庫就這樣做成了。以後可以隨便調用了。
❿ C/C++頭文件和庫文件的區別和聯系是什麼
頭文件中有函數的申明,庫文件實現函數的定義。
比如,printf函數。使用時應包括stdio.h,打開stdio.h你只能看到,printf這 個函數的申明,卻看不到printf具體是怎麼實現的,而函數的實現在相應的C庫 中。
而庫文件一般是以二進制形式而不是C源文件形式提供給用戶使用的。
程序 中包括了stdio.h這個頭文件。鏈接器就能根據頭件中的信息找到printf這個函 數的實現並鏈接進這個程序代碼段里。
總結起來就是,庫文件通過頭文件向外導出介面。用戶通過頭文件找到庫文件中 函數實現的代碼從而把這段代碼鏈接到用戶程序中去。