1. 程式人生 > >Windows 編程,程序編譯使用的命令行工具。

Windows 編程,程序編譯使用的命令行工具。

開發 集成 結果 runt 編寫 format stream 學習 更多

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 function
int 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_H

class 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 foo
main.obj:main.cpp
    cl.exe -EHsc -c main.cpp
header.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 編程,程序編譯使用的命令行工具。