A. C++如何編譯出DLL文件
如果使用的是VS,可以進行如下操作:
打開VS, 文件-新建-新建項目-其他語言-Visual C++ -Win32 控制台應用程序。
單擊確定後,彈出對話框,按照對話框「下一步」提示進行操作。
將要編譯的C文件拷貝到CreateDLL項目中,.h文件就放到頭文件夾的目錄下,.c文件放到源文件目錄下,注意後綴名為.c的文件都要改成.cpp,否則編譯會出錯。
注意:申明函數時必須參照上圖紅框標示出來的規則,在Function.cpp文件中必須要引入對應的#include CreateDLL.h。
選中所有需要編譯成dll的cpp文件,右鍵-屬性-預編譯頭-不使用預編譯頭,然後選擇 「生成」即可,這樣在項目的Debug文件夾下面便可找到CreateDLL.dll文件
B. 如何將編寫好的C語言源程序變成可執行文件EXE
1、第一步,打開C語言編譯軟體,輸入你要執行的程序源代碼,如下圖所示。
C. 怎麼用Keil將C程序封裝成lib庫
在團隊工作中,經常會有模塊維護和代碼封裝的問題。把需要封裝的代碼打成一個lib無疑是一種很好的方式。
1.創建lib
創建一個lib很容易,只需要創建一個target,然後把需要封裝的代碼全部加進來,然後再Options of Target中選擇Create Library,然後編譯,因為是lib所以不需要鏈接,編譯過了,你的lib就創建了。當然了,為了別人可以輕松的使用,請提供頭文件支持哦。
2.使用lib
使用lib就更容易了,把lib和頭文件加入你的工程,直接調用就是了。lib庫會和你工程中其它編譯後的obj一起鏈接,形成最後的目標文件。
3.注意事項
首先,Startup和中斷處理程序不要封入LIB,這些程序會在鏈接的時候產生問題。具體的原因么,有點復雜,應該是中斷程序的link機制有所不同的關系吧。
其次,Lib的文件要分的細一點,沒有調用關系的兩個函數不要放到同一個C文件中,因為LIB51在鏈接的時候是按模塊來鏈接的,一個模塊就對應一個C文件,假如鏈接器因為要使用你一個函數fA而引入了A模塊,那麼A模塊中的另外的函數也會被引入,而另外的函數你又沒有使用的話,那麼就會引發Keil經典的UNCALLED FUNC的warning。這個warning在Keil的文檔中說的好清楚了,我粘過來吧:
It is common practice ring the development process to write but not call
additional functions. While the compiler permits this without error, the
Linker/Locator does not treat this code casually because of the support for data
overlaying, and emits a warning message.
Interrupt functions are never called, they are invoked by the hardware. An
uncalled routine is treated as a potential interrupt routine by the linker. This
means that the function is assigned non-overlayable data space for its local
variables. This quickly exhausts all available data memory (depending upon the
memory model used).
If you unexpectedly run out of memory, be sure to check for linker warnings
relating to uncalled or unused routines. You can use the linker』s IXREF
directive to include a cross reference list in the linker map (.M51) file.
大意就是說,Keil的內存應用模式是指定地址的,也就是要根據調用關系來決定哪塊地址可以被復用。對於這種沒人調用的函數,Keil會認為是中斷處理程序,並不能決定調用關系,所以此類uncalled函數的空間不能和其他的程序共享,也就是說,這函數用多少RAM,你就少多少RAM。那uncall多了會怎麼樣?----廢話,當然是內存溢出了。
所以,lib的功能可以做的大而全,但是裡面的模塊一定要分的要多細,有多細,只有這樣,你才能像在windows上用CRT一樣舒服的使用LIB。
個人總結
1. 生成lib 的工程可以沒有main函數,可以只有一個.c文件,一個.c文件中可以只有一個函數
2. 需要在lib工程中建立一個.h文件, 必須用extern聲明各全局變數和函數.
3. 調用lib文件的工程中必須包括lib中的.h文件, 也就是lib工程和調用工程都包含同一個.h文件(好像有點廢話)
4.Lib的文件要分的細一點,沒有調用關系的兩個函數不要放到同一個C文件中. 沒有調用關系的最好是一個函數單獨放在一個.c文件中.這是為了避免在keil中應用程序調用lib庫里出現告警. 因為LIB51在鏈接的時候是按模塊來鏈接的,一個模塊就對應一個C文件,假如鏈接器因為要使用你一個函數fA而引入了A模塊,那麼A模塊中的另外的函數也會被引入,而另外的函數你又沒有使用的話,那麼就會引發Keil經典的UNCALLED FUNC的warning。
通常為每一個函數編一個.C文件,而整個lib用一個.h文件,這樣就可以使只有被調用的函數參與連接
5.調用lib庫時需要在工程中將.lib文件加進來. 在Group中右鍵,然後Add ,注意文件類型中選擇*.lib.
D. 怎樣用Microsoft visual c++把c源代碼編譯成exe 可執行文件
以VC6舉例:
1、打開電腦上安裝的vc6.0,進入如圖界面
E. C語言編寫好代碼後,怎麼編譯,最後生成可執行文件
材料/工具:vc6.0
1、打開c語言編輯工具,在工具中寫入程序的源代碼。
F. 有個 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
G. c語言如何把c程序編譯成可執行的exe文件
1、編寫一段簡單的代碼,如下圖所示,編輯一段簡單的輸出語句。