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.用官方的题目说就是 ...
随机推荐
- java ee Servlet 开发框架分享
大家好! 这里分享一下javaEE Servlet开发框架! 1.首先是POST和GET入口以及接收处理文件 package com.sl.imps; import java.io.IOExcepti ...
- java中堆栈的功能作用 以及區別(搜集)
1.用new创建的对象在堆区,函数中的临时变量在栈区,Java中的字符串在字符串常量区. 2.栈:存放进本数据类型的数据和对象的引用,但对象本身不存在栈中,而是存放在堆中. 堆:存放new产生 ...
- 实例讲解webpack的基本使用第一篇
更新文章不容易,尤其是更新高质量的文章更加不易,因此为了节约时间,闲话就不多说了.关于webpack的介绍,webpack是用来干嘛的,这些基础概念性的东西,就不在此赘述,下面直接开始正题. webp ...
- PHP,Mysql根据经纬度计算距离并排序
网上给出的计算公式是这样的: Lng1表示A点纬度和经度,Lat2 Lng2 表示B点纬度和经度 a = Lat1 – Lat2为两点纬度之差 b = Lng1 -Lng2 为两点经度之差 6378. ...
- 550 Create directory operation failed
往Linux系统中上传文件时候,我们经常会使用FTP连接Linux,也经常会使用mkdir命令来创建目录.最近发现用mkdir创建目录时提示550 Create directory operation ...
- SQLServer中重建聚集索引之后会影响到非聚集索引的索引碎片吗
本文出处:http://www.cnblogs.com/wy123/p/7650215.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...
- cocos2dx - 创建地图及玩家(伪)
接上一节内容:cocos2dx - 环境配置,项目创建 本节主要描述cocos中精灵的创建及点击事件的使用 打开创建好的test项目,看到下图的目录结构,真正的游戏逻辑路径在src下. AppDele ...
- C#使用Xamarin开发可移植移动应用进阶篇(10.综合演练,来一份增删改查CRUD)
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 呃 也有半 ...
- SAP 邮件发送
1.******************** *调用发送邮件函数 CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1' EXPORTING DOCUMENT_DA ...
- caffe源码 池化层 反向传播
图示池化层(前向传播) 池化层其实和卷积层有点相似,有个类似卷积核的窗口按照固定的步长在移动,每个窗口做一定的操作,按照这个操作的类型可以分为两种池化层: 输入参数如下: 输入: 1 * 3 * 4 ...