Windows 編程,程式編譯使用的命令列工具。

來源:互聯網
上載者:User

標籤:進一步   ase   define   err   還需   學習   format   modify   拷貝   

Windows 編程,程式編譯使用的命令列工具。

 

1.cl.exe檔案是Visual C\C++的編譯器,它將程式原始碼檔案編譯為obj檔案。


2.rc.exe檔案是資源編譯器。工程項目中的.rc檔案中包含了對程式中所使用資源(菜單、表徵圖等)的描述。rc.exe將.rc格式的檔案編譯為.res檔案,供連結器連結到可執行檔中。


3.link.exe是Windows平台的連結器,它將cl.exe編譯產生的obj檔案,資源編譯器產生的.res檔案,以及lib目錄下的lib檔案等連結成可執行檔exe檔案、dll檔案等。

 

在程式編譯完成後,產生的檔案是以obj為副檔名的對象檔案,link.exe是將對象檔案和庫連結起來以建立可執行程式檔案或動態連結程式庫檔案的工具。

 

link.exe的輸入檔案包括obj檔案、lib檔案、exp檔案、def檔案、res檔案、txt檔案、ilk檔案。輸出檔案是exe檔案、dll檔案、sys檔案等可執行程式檔案。

 

其他工具

1.BSCMAKE.EXE
產生一個資訊檔(.bsc),用於瀏覽程式中的符號(類、函數、資料、宏和類型)資訊。可以在整合式開發環境的瀏覽視窗中查看這些資訊(.bsc檔案也可以在IDE中產生)。


2. LIB.EXE
用於產生COFF格式的lib庫檔案,可用於建立匯出檔案和引用匯出定義的匯入庫,在為其他開發人員提供開發介面時非常有用。


3. EDITBIN.EXE
可用於編輯COFF格式的二進位檔案。


4.DUMPBIN.EXE
可顯示COFF二進位檔案的有關資訊,比如符號表等。
比如,使用dumpbin.exe分析第1章的start.exe。選擇“工具”→“Visual Studio命令提示”切換到start.exe所在的目錄,運行:
在bin_info.txt中包含了可執行檔中非常豐富的資訊,包括檔案頭資訊、節資訊等。


5. NMAKE.EXE
程式維護工具 + 生產力,讀取和執行組建檔案。將在3.3節中詳細
介紹nmake的使用。


6. ERRLOOK.EXE
錯誤尋找工具,與GetLastError API函數配合使用,在程式調試時起到了很多的作用,用於分析Windows API的調用錯誤。3-1所示,在Visual Studio IDE中,可以通過菜單“工具”→“錯誤尋找”來使用。

 

通過命令列使用cl.exe編譯器

http://www.cnblogs.com/LCCRNblog/p/4532643.html

與在IDE中編譯相比,命令列模式編譯速度更快,並可以避免被IDE產生的一些附加資訊所幹擾,下面介紹在Win7 命令列下編譯C++。

1、 首先要正確安裝Visual Studio 2010,安裝路徑(D:\Program Files)

2、設定環境變數:

PATH=D:\Program Files\Microsoft Visual Studio 10.0\VC\bin

INCLUDE=D:\Program Files\Microsoft Visual Studio 10.0\VC\include

LIB=D:\Program Files\Microsoft Visual Studio 10.0\VC\lib

2、寫一個hello world C++程式

 

/*the first C++ program*/#include <iostream>using namespace std;//main functionint main(){    cout<<"Hello world!"<<endl;    cout<<"This is my first C++ program.\n";}

 

儲存路徑 C:\Users\zhongqin.mi\hello.cc

3、重啟電腦,開啟命令列,執行如下命令

其中,cl是調用編譯器的命令,-GX是一個選項,該選項在使用命令列介面編譯器時是必須的。微軟編譯器自動產生與源檔案同名的可執行檔,

這個可執行檔具有.exe尾碼且與源檔案同名,更多資訊可以參考編譯器使用者指南。

注意:(2015年5月27日15:45:59添加)

在第二步中環境變數的配置中,其實可以不用配置,只是在每次使用cl.exe之前,運行一遍vcvarsall.bat(在“vs安裝路徑\VC”路徑下)即可,運行vcvarsall.bat後,就可以使用cl.exe,link.exe和Nmake.exe,只是每次使用前都要運行一遍vcvarsall.bat,並且只能在運行vcvarsall.bat的cmd視窗才能使用以上三個exe。

4、常見問題

    4.1 如果提示找不到mspdb100.dll檔案,則從D:\Program Files\Microsoft Visual Studio 
10.0\Common7\IDE下拷貝“mspdb80.dll”這四個檔案到D:\Program 
Files\Microsoft Visual Studio 10.0\VC\bin下即可。

   4.2 如果執行 cl命令時遇到提示  LINK : fatal error LNK1104: 無法開啟檔案“kernel32.lib”, 則把C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib目錄下的kernel32.lib拷貝到D:\Program 
Files\Microsoft Visual Studio 10.0\VC\lib目錄下即可。

 

--------------------------------------------------------------------------分割線------------------------------------------------------------------------

2015年5月27日16:51:38

如果有多個檔案要一起編譯串連呢,自己動手做了如下簡單的入門體驗。

首先建立如下源檔案heade.h,header.cpp,main.cpp

//header.h

#ifndef _HEADER_H#define _HEADER_Hclass A{public:    A();    A(int);    void print();private:    int member;};#endif

//header.cpp

#include "header.h"#include <iostream>using namespace std;A::A(){    member = 0;}A::A(int init){    member = init;}void A::print(){    cout << member <<endl;}

//main.cpp

#include <iostream>#include "header.h"using namespace std;int main(){    cout << "Hello world!\n";    A a(100);    a.print();    return 0;}

然後按照上面介紹的方法,在cmd中輸入:cl main.cpp header.cpp

 

windows環境中利用NMake工具編譯串連C++原始碼

  最近在寫代碼的時候,需要通過命令的方式來執行產生的c++原始碼檔案,因此需要學習有關windows環境下如何使用命令來編譯串連c++原檔案。這一篇文章是自己慢慢摸索實踐得出的。作為自己入門的起點吧,後續還要好好深入理解這方面的知識。

1、準備

編寫好main.cpp header.h header.cpp這三個原始碼檔案,並放入一個檔案夾test中。

2、編寫NMake檔案

在test檔案夾中建立hello.mk檔案,並寫入如下指令碼

foo :main.obj header.obj    cl.exe -EHsc main.obj header.obj -o foomain.obj:main.cpp    cl.exe -EHsc -c main.cppheader.obj:header.h header.cpp    cl.exe -EHsc -c header.cpp clean:    del *.obj *.exe

注意指令碼中空格需要保留,不能隨意添加和刪除。至於為什麼,我暫時也不太清楚,後續慢慢瞭解學習。

-----------------------------------------------------------------------------補充 2015年5月29日17:17:56------------------------------------------------

第二行cl.exe -EHsc main.obj header.obj -o foo,這一行-o之前的參數都是傳遞個cl.exe的,-o之後的參數(包括-o)是傳遞個Link.exe的。

----------------------------------------------------------------------------------------------------------------------------------------------------------

我在實踐的過程中,把”header.obj:header.h header.cpp“這一行中的header.h去掉,重新執行這個指令檔,任然能夠通過,這個原因我暫時還不太清楚,因為我也只是剛剛接觸這方面的知識,還需要進一步的嘗試,進一步的理解其中的原理。

然後在開啟cmd,定位到test檔案路徑,首先執行vcvarsall.bat(方法在上一篇文章中有涉及),然後執行如下命令

NMake /f hello.mk

在test檔案夾中就會產生foo.exe可執行檔。

如果執行如下命令

NMake /f hello.mk clean

則在test檔案夾中產生的所有*.obj和*.exe都會被刪除。

 

C Run-Time Error R6034問題的解決

1、問題描述

      這兩天一直在用vs2008編寫一個小項目,需要在c++代碼中通過命令列的方式調用cl.exe和link.exe,也就是給編譯器cl和連結器link傳遞參數,然後編譯連結產生可執行檔exe.最終產生的result.exe運行時老出現Runtime Error R6034 An application has made an attempt to load the C runtime library incorrectly.的錯誤,圍繞這個問題,我查了兩天的資料,最後終於解決了。。

  在此簡單的記錄一下解決方案,方便以後用到。

2、問題解決

  在利用命令列的方式編譯連結產生可執行檔之前,可以將需要傳遞給cl.exe的來源程式(.cpp,.h)檔案拎出來,利用這些源檔案手動的建立一個vs2008工程,然後編譯連結這個vs2008工程產生可執行檔。做這一步是為了保證產生的可執行檔是你本人需要的結果,如果這個手動工程都不能產生你需要的exe,那通過命令列的方式產生的exe肯定就不是你想要得到的結果。

  產生好vs2008工程並且執行正確後,在這個工程的項目--->屬性-->c/c++--->命令列,你會看到一大堆的命令,其實這就是傳遞給cl.exe的命令,同樣的道理,在項目--->屬性-->連結器--->命令列中可以看到傳遞給link.exe的命令。

  按照上面所說的方法,我在自己的項目中編寫好自動產生exe 的代碼產生一個exe。然後點擊這個exe,就出現Runtime Error R6034 。

  下面貼上解決該問題的原文:

  An application has made an attempt to load the C runtime library without using a manifest. This is an unsupported way to load Visual C++ DLLs. You need to modify your application to build with a manifest. For more information, see the "Visual C++ Libraries as Shared Side-by-Side Assemblies" topic in the product documentation.
  Applications must use a manifest to load the C runtime library. For more information, see Visual C++ Libraries as Shared Side-by-Side Assemblies and Manifest Generation in Visual Studio.
In release builds, the diagnostic message reads: "An application has made an attempt to load the C runtime library incorrectly. Please contact the application‘s support team for more information."
  To correct this error
  Rebuild your application to include a manifest. Building an application with Visual Studio automatically puts the manifest into the resulting .exe or .dll file. If you are building at the command line, use the mt.exe tool to add the manifest as a resource. Use resource ID 1 if you build an .exe, and resource ID 2 if you build a .dll. For more information, see How to: Embed a Manifest Inside a C/C++ Application.

  重點是這一句:If you are building at the command line, use the mt.exe tool to add the manifest as a resource. Use resource ID 1 if you build an .exe, and resource ID 2 if you build a .dll. For more information, see How to: Embed a Manifest Inside a C/C++ Application.

  按照這個說法,命令列不僅需要調用cl.exe和link.exe,還需要調用一個叫mt.exe的,mt.exe的參數其實在上文建立的vs2008工程下項目--->屬性--->清單工具---->命令列有相關的命令參數。在命令中添加這一個命令之後重新執行,問題就可解決了。

 

Win32DLL,MFC常規DLL和MFC拓展DLL

Win32DLL使用的是Win32的API實現的,只能匯出函數,能被各種應用程式調用,適用範圍最廣。

MFC常規DLL是適用MFC建立的,就像MFC程式跟Win32程式的關係一樣,MFC常規DLL和Win32DLL的關係也是如此。它使用MFC的機制,只能匯出標準C函數。如此,它便可以被大部分Win32程式調用。

MFC拓展DLL也也使用的是MFC機制建立的,相比於MFC常規DLL,拓展DLL可以匯出C++類和MFC衍生類別,如此擴大了DLL的介面範圍。此長彼消,MFC拓展DLL的適用範圍較小,只能被MFC程式調用。因為它匯出的不只是函數,還有C++類和MFC衍生類別。

另外,所有的動態連結程式庫都有兩種連結方式:隱式調用和顯示調用。隱式連結使用起來比較方便,不過不夠靈活;顯示連結可以在真正要用DLL的時候才裝入,並在適當的時候釋放,操作相對複雜一些。

 

 最常見的Windows資料類型

 

 常用的環境變數

 

 

Windows 編程,程式編譯使用的命令列工具。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.