Windows 编程,程序编译使用的命令行工具。
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 编程,程序编译使用的命令行工具。的更多相关文章
- Windows自带MD5 SHA1 SHA256命令行工具
感恩大佬LiuYanYGZ的文章 MyHash 检验工具http://www.zdfans.com/html/4346.html HashMyFiles Hash校验工具http://www.nirs ...
- [Windows]_[0基础]_[使用命令行工具dumpbin分析文件]
dumpbin(vs拥有) 1. 出口lib函数符号文件(symbols) dumpbin /exports zlib1.lib Microsoft (R) COFF/PE Dumper Versio ...
- 转:windows下命令行工具
转自: http://www.cnblogs.com/haochuang/p/5593411.html Windows下CMD不好用,远没有Linux,或者一些SSH工具用起来方便.其实Windows ...
- 10款Windows命令行工具
Windows下CMD不好用,远没有Linux,或者一些SSH工具用起来方便.其实Windows下,也有一些不错的工具替代CMD: 0.powercmd经过比较,我最终选择了这款,这里补充一下截图:
- Scrapy命令行工具简介
Windows 10家庭中文版,Python 3.6.4,virtualenv 16.0.0,Scrapy 1.5.0, 在最初使用Scrapy时,使用编辑器或IDE手动编写模块来创建爬虫(Spide ...
- Hash校验工具、MD5 SHA1 SHA256命令行工具
MyHash 检验工具http://www.zdfans.com/html/4346.html HashMyFiles Hash校验工具http://www.nirsoft.net/utils/has ...
- nodejs 编写(添加时间戳)命令行工具 timestamp
Nodejs除了编写服务器端程序还可以编写命令行工具,如gulp.js就是Nodejs编写的. 接下来我们来实现一个添加时间戳的命令: $ timestamp action https://www.n ...
- 通过阿里云命令行工具 aliyuncli 购买服务器
开始想通过 aliyuncli 的 golang 源码进行编译安装(注:python 版的 aliyuncli 已不再维护),但没成功,详见 通过 golang 源码编译阿里云命令行工具 aliyun ...
- windows下的命令行工具babun
什么是babun babun是windows上的一个第三方shell,在这个shell上面你可以使用几乎所有linux,unix上面的命令,他几乎可以取代windows的shell.用官方的题目说就是 ...
随机推荐
- 由一次自建库迁移到阿里云RDS引发的性能问题。
刚入职一互联网公司,项目正好处于计划上线的时间,由于公司前不久已经购买了rds服务,领导决定尝试一番! 当然,新事物.云事物还是要谨慎的.安排我先把测试环境数据库迁移上去,这里吐槽一下,往rds迁移一 ...
- Day-1:初识开发板与基础知识
买的这款51,ARM,AVR三合一的单片机,也不知道后面具体使用会不会有问题,先玩玩看吧. ------------------------------------------------------ ...
- Redis学习笔记之二 :在Java项目中使用Redis
成功配置redis之后,便来学习使用redis.首先了解下redis的数据类型. Redis的数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set( ...
- AngularJS中的DOM与事件
前 言 AngularJS中的DOM与事件 AngularJS 为 HTML DOM 元素的属性提供了绑定应用数据的指令. ng-disabled="true/false" ...
- ElasticSearch入门(2) —— 基础概念
在Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中,我们可以画一些简单的对比图来类比传统关系型数据库: Relational DB -> Dat ...
- 初识Hibernate之关联映射(一)
上篇文章我们对持久化对象进行的学习,了解了它的三种不同的状态并通过它完成对数据库的映射操作.但这都是基于单张表的操作,如果两张或者两张以上的表之间存在某种关联,我们又该如何利用持久化对象进行操作呢?本 ...
- 一脸懵逼学习基于CentOs的Hadoop集群安装与配置
1:Hadoop分布式计算平台是由Apache软件基金会开发的一个开源分布式计算平台.以Hadoop分布式文件系统(HDFS)和MapReduce(Google MapReduce的开源实现)为核心的 ...
- Crossin-8-1;8-2课程记录
打开文件: open,注意打开文件的路径 读取结束需使用close读取文件: read readlines readline for in 重置光标位置: se ...
- Android 导入引用第三方项目
环境:Android Studio 1.4 1 以源工程形式导入 第一步,导入项目 File--New--Import Module--->设置导入后的项目名称 第二部,在自己工程中添加Depe ...
- C语言 流缓冲
**From : https://www.gnu.org/software/libc/manual/html_node/Stream-Buffering.html** 12.20 流缓冲 通常情况下, ...