VS构建工具介绍
我们都知道C/C++源代码要生成可执行的.exe程序,需要经过预处理、编译、链接的过程。你在VS工具中只需要选择菜单Build或按一下F可以编译生成我们的可执行程序exe文件,其实IDE帮我隐藏了好多的具体细节。
打开VS2010安装目录,打开VC\bin可以看到一系列的可执行程序.exe和批处理文件,这些就是VS2010构建、编译、链接时要用到的工具。看一下几个主要的工具:
cl.exe:编译程序
link.exe:链接程序
lib.exe:加载lib库的程序
nmake.exe:用makefile进行构建、编译的工具
dumpbin.exe: 查看dll或exe的依赖库
命令行编译程序
此处有两种方法一种是通过配置系统环境变量然后在系统命令窗口执行,另一种是在vs中直接打开visual studio 命令提示符
其实第二种方法就是通过第一种方法来的(执行了vsvars32.bat)有兴趣可以去了解一下。
CL.EXE测试
#include #include int main()
{
std::cout << "This is a native C++ program." << std::endl;
printf("printf: Hello World");
return 0;
}
编译执行结果:
在以上的编译过程中我们只用了cl的编译命令就帮我们最终的可执行文件main.exe,这是因为cl.exe程序在编译时自己会去调用link.exe、lib.exe等程序。
以上只是最简单所有都是采用默认的编译选项,实际工作中我们需要根据不同场景选择不同编译选项来编译我们的代码,下面对cl.exe的使用做简单介绍,直接在命令窗口输入cl会显示用法:
输入cl /?或者输入cl -help(-help)则会显示所有的编译选项及具体含义:
如果不明白可以和vs的属性设置对照了来看,在属性->配置属性->c/c++->命令行是包含你设置的编译选项集合和用法。
LINK.EXE测试
我们知道通过cl.exe编译后产生的是一个个的obj文件,此时并没有生成我们的可执行文件(此处只针对windows下,后缀名可指定文件类型),如果要生成可执行文件就必须通过链接器将所有obj和lib等文件链接起来生成我们的可执行程序。
将前面的程序稍作修改,添加test.cpp文件,做一个小测试。
main.cpp
#include #include #include "test.h"
int main()
{
test1();
test2();
std::cout << "This is a native C++ program." << std::endl;
printf("printf: Hello World");
return 0;
}
test.cpp
#include"test.h"
#include
void test1()
{
std::cout< }
void test2()
{
std::cout< }
通过cl.exe编译生成main.obj和test.obj文件(此时需要指定/c编译选项告诉编译器只要给我生成obj目标文件即可不要链接),然后调用link.exe将他们链接成一个可执行程序main.exe,生成的可执行文件名字可通过/out:"helloworld.exe"修改。
链接静态库、动态库,此处通过指定链接运行时库来测试,默认链接的是静态运行时库libcmt.lib,我们来测试一下,此处我们指定链接动态运行时库msvcrt.lib
我们发现会出现大量链接错误2005,这是因为msvcrt.lib和libcmt.lib的实现是一样的所以两个都链接就会出现重定义的错误(这里其实就是我们在编译器里选择MT、MTd、MD、MDd等链接方式后链接的不同选项,有兴趣的可以去了解一下这个单独都可以讲一章此处就不在这里详细介绍),看上面截图中黄色方框中我们可以看到默认的库是libcmt.lib证明上面说的是对的,从上面的测试我们还应该认识到一点就是在我们程序开发中各个库或者模块应该统一运行时库否则会出现error 2005井喷,那么此处我们应该怎么办呢?第一就是使用默认的libcmt.lib,第二使用链接选项/NODEFAULTLIB来禁用默认链接库然后再指定我们想要链接的库。
此时可以正常链接成功生成可执行程序helloworld.exe
通常我们生成的程序为了方便调试都会提供一个pdb文件,通过前面测试会发现虽然我们生成了可执行文件但是并没有生成对应的pdb文件,那么通过命令行怎么生成呢?查看命令link查看链接选项在其中找到一个/DEBUG选择,在链接时加入此选项就会生成对应的pdb文件,可通过/pdb:"helloworld.pdb"来设置生成pdb的名称。
对应的vs中的设置是 属性->配置属性->链接器->调试->生成调试信息
同样的如果对于一些选项用法不明了可以参照vs来测试使用,在链接器的命令行中包含你设置的链接选项用法
其他
dumpbin可以用来查看exe,lib,dll,obj文件的依赖项,导入导出函数等,dumpbin /dependents 文件名 查看依赖库
lib.exe可把def文件生成lib文件,举个列子:
lib /out:F:\CC\def\sqlite3.lib /MACHINE:X64 /DEF:F:\CC\def\sqlite3.def
本文是作为我学习笔记来记录,如有错误请指正,不喜勿喷。