程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 抽取VS文件組成類GCC的編譯器,並編譯C程序為dll動態鏈接庫

抽取VS文件組成類GCC的編譯器,並編譯C程序為dll動態鏈接庫

編輯:關於C語言

用慣了linux下的GCC編譯工具,倒喜歡起命令行的方式編譯鏈接C程序,居然還發現我裝的VS工具沒看到直接編譯C程序的工具我不太熟悉這個)。VS的編譯文件命令是cl,鏈接命令是link。參考了網上資料,采用提取VS的編譯器文件組成一個可以命令行方式編譯程序的工具。以下為步驟:1,在自己目錄創建文件夾,如:D:/vctool;2,將VS安裝目錄下的VC目錄下的bin、lib、include目錄考到vctool目錄下;3,將c:/Program Files/Microsoft SDKs/Windows/V6.0A或類似目錄,亦是VS的安裝文件)下的Lib目錄拷到vctool目錄下,並記得不要覆蓋而是重命名為sdklib;4,現在所需的命令文件和類庫、include文件都拷過來了,將bin目錄加到環境變量path中;5,接下來可以編寫c語言文件 Test.c:#include "stdio.h"        
__declspec(dllexport) int sum(int a, int b)    
{    
        return a + b;    
}    
5,編寫編譯文件:build.bat:set PATH=./;D:/vctool/bin;%path%
set INCLUDE=D:/vctool/include
set LIB=D:/vctool/lib;D:/vctool/sdklib

cl /c Test.c
link /dll Test.obj
pause
6,雙擊運行build.bat,發現編譯錯誤,找不到mspdb80.dll文件:
於是在VS安裝目錄下搜索,將該文件拷貝到vstool/bin目錄下;再雙擊build.bat編譯,編譯成功,目錄下已生成:Test.dll Test.lib Test.obj
若鏈接的時候出現 LINK: fatal error LNK1104:無法打開文件“kernel32.lib” 錯誤,則是因為sdklib沒拷對或者沒設到環境變量LIBbuild.bat)
以下為網上找到的相關資料:2.下面詳細介紹下cl命令:        cl.exe 是控制 Microsoft C 和 C++ 編譯器與鏈接器的 32 位工具。編譯器產生通用對象文件格式 (COFF) 對象 (.obj) 文件。鏈接器產生可執行文件 (.exe) 或動態鏈接庫文件 (DLL)。        注意,所有編譯器選項都區分大小寫。        用法如下:        CL [option...] file... [option | file]... [lib...] [@command-file] [/link link-opt...]        option : 一個或多個 CL 選項。請注意,所有選項都應用於所有指定的源文件。選項是由一個正斜槓 (/) 或一個短劃線 (-) 指定的。如果某個選項帶有參數,則該選項的說明指定在選項和參數之間是否允許有空格。選項名/HELP 選項除外)區分大小寫。 CL:        /c : 編譯但不鏈接        /Zs : 檢查語法         /? : 列出編譯器選項         /arch : 使用 SSE 或 SSE2 指令生成代碼         /arch:SSE2         /clr : 啟用 C++ 的托管擴展並產生在公共語言運行庫上運行的輸出文件         /F : 設置堆棧大小 | 此選項設置程序堆棧大小以字節為單位)。如果不使用此選項,堆棧大小默認為 1 MB,比如:/F 100        /Fe : 重命名可執行文件        /Feexe.exe         /G7 :針對 Pentium 4 或 Athlon 優化代碼。         /GA :優化 Windows 應用程序的代碼         /GL :啟用全程序優化         /Gm :啟用最小重新生成         /HELP :列出編譯器選項         /I :在目錄中搜索包含文件 | 指定源文件目錄 include,例如:/I "e:\VC\include"        /link : 將指定的選項傳遞給 LINK         /MD : 使用 MSVCRT.lib 創建多線程 DLL         /ML : 使用 LIBC.lib 創建單線程可執行文件         /MT : 使用 LIBCMT.lib 創建多線程可執行文件         /O1 : 創建小代碼         /O2 : 創建快速代碼         /Os : 代碼大小優先         /W : 設置警告等級         /W3        /Ot : 代碼速度優先         /LD : 創建動態鏈接庫        /Ox : 使用最大優化        /TC : 指定 C 源文件         /TP : 指定 C++ 源文件         -----------------------------------------------------------------------------------------        file : 一個或多個源文件、.obj 文件或庫的名稱。CL 編譯源文件並將 .obj 文件和庫的名稱傳遞給鏈接器。有關更多信息,請參見 CL 文件名語法。         lib : 一個或多個庫名。CL 將這些名稱傳遞給鏈接器。         command-file: 包含多個選項和文件名的文件。有關更多信息,請參見 CL 命令文件。         link-opt : 一個或多個鏈接器選項。CL 將這些選項傳遞給鏈接器         ---------------------------------------------------------------------------------------------        精典用法:        cl *.cpp /G7 /MD /Ox /Ot /W3 /c /EHsc /I"G:\Visual C++\VC98\PlatformSDK\Include"
3.說道cl,不得不說一下另一個工具link        link是將通用對象文件格式 (COFF) 對象文件和庫鏈接起來以創建 32 位可執行 (.exe) 文件或動態鏈接庫 (DLL) 的 32 位工具。        link用法如下:        /ALIGN : 指定每一節的對齊方式         /ALIGN : 選項指定程序線性地址空間中每一節的對齊方式。number 參數以字節為單位,並且必須是2 的冪。默認值是 4K (4096)。如果對齊方式產生無效的圖像,則鏈接器發出警告。除非正在編寫諸如設備驅動程序的應用程序,否則應不需要修改對齊方式。        /DLL : 生成 DLL         /DRIVER : 創建 Windows NT 核心模式驅動程序         /EXETYPE : 生成虛擬設備驅動程序         /EXETYPE:DYNAMIC 創建動態加載的虛擬設備驅動程序。         /EXETYPE:DEV386 創建靜態加載的虛擬設備驅動程序。這是 /EXETYPE 的默認值        /INCREMENTAL : 控制增量鏈接         /LARGEADDRESSAWARE : 通知編譯器應用程序支持大於 2 GB 的地址         /LIBPATH : 允許用戶重寫環境庫路徑         /LIBPATH:"e:\VC\LIB" /LIBPATH:"e:\DX\LIB"        /MACHINE : 指定目標平台         /MACHINE:{AM33|ARM|EBC|IA64|M32R|MIPS|MIPS16|MIPSFPU|MIPSFPU16|MIPSR41XX|SH3|SH3DSP|SH4|SH5|THUMB|X86| X64/*8.0版本*/}        /MACHINE : X86        /NOENTRY : 創建純資源 DLL,創建純資源 DLL 時要求 /NOENTRY 選項。        /OPT : 控制 LINK 優化如果生成僅運行於 Windows NT 或 Windows 2000 上的組件,則應使用 /OPT:NOWIN98。        /SUBSYSTEM : 指定子系統 {CONSOLE|EFI_APPLICATION|EFI_BOOT_SERVICE_DRIVER|EFI_ROM|EFI_RUNTIME_DRIVER|NATIVE|POSIX|WINDOWS|WINDOWSCE}[,#[.##]]        /OUT : 指定輸出文件名,比如:/OUT:Hello.exe        ---------------------------------------------------------------------------------------------        精典用法:        link *.obj rc.res /LIBPATH:"G:\Visual C++\lib" /SUBSYSTEM:WINDOWS /MACHINE:X86 kernel32.lib user32.lib        gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib OpenGL32.Lib

4.另外:rc 是資源編譯        /l 列出資源用的區域性         0x804 中國        0x409 美國         用法:rc /l 0x804 file.rc        ---------------------------------------------------------------------------------------------        MFC 開發如下:        編譯源代碼:        cl *.cpp /Ox /Ot /G7 /D "WIN32" /D "_WINDOWS" /D "_AFXDLL" /EHsc /MD /arch:SSE2 /W3 /c        資源編譯 :        rc /l 0x804 winmfc.rc        鏈接 :        link *.obj WinMFC.res /out:WinMFC.exe /OPT:NOWIN98 /SUBSYSTEM:WINDOWS /MACHINE:X86
參考網頁:http://blog.csdn.net/woaixiaozhe/article/details/7837768

本文出自 “小何貝貝的技術空間” 博客,請務必保留此出處http://babyhe.blog.51cto.com/1104064/1129435

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved