vs2010c语言命令行参数,模仿Visual Studio————命令行编译C/C++程序

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 命令提示符

fb2efbeb707e0f58795754c368399982.png a04f02d59993f68d8d85e869c32346d2.png

其实第二种方法就是通过第一种方法来的(执行了vsvars32.bat)有兴趣可以去了解一下。

CL.EXE测试

#include #include int main()

{

std::cout << "This is a native C++ program." << std::endl;

printf("printf: Hello World");

return 0;

}

编译执行结果:

a3be01955bbaef547cb358e7ca512bbd.png

在以上的编译过程中我们只用了cl的编译命令就帮我们最终的可执行文件main.exe,这是因为cl.exe程序在编译时自己会去调用link.exe、lib.exe等程序。

以上只是最简单所有都是采用默认的编译选项,实际工作中我们需要根据不同场景选择不同编译选项来编译我们的代码,下面对cl.exe的使用做简单介绍,直接在命令窗口输入cl会显示用法:

aa16d6b4cc92bf29e9d3c047a41e5b4d.png

输入cl  /?或者输入cl -help(-help)则会显示所有的编译选项及具体含义:

38bce8cc6b4f906bd25424156a2558c9.png

如果不明白可以和vs的属性设置对照了来看,在属性->配置属性->c/c++->命令行是包含你设置的编译选项集合和用法。

d8dd039ae768349bf6c726fb9d3dad19.png

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"修改。

e0f7623535ebe99bda3f4c1d55b8091a.png

a4c4de07de701166ab4e9a4dfb24ce23.png

链接静态库、动态库,此处通过指定链接运行时库来测试,默认链接的是静态运行时库libcmt.lib,我们来测试一下,此处我们指定链接动态运行时库msvcrt.lib

b899ecba575c66b3bf658e916ffd0746.png

cc3a239325c2bb8e29f7c5318fb61420.png

我们发现会出现大量链接错误2005,这是因为msvcrt.lib和libcmt.lib的实现是一样的所以两个都链接就会出现重定义的错误(这里其实就是我们在编译器里选择MT、MTd、MD、MDd等链接方式后链接的不同选项,有兴趣的可以去了解一下这个单独都可以讲一章此处就不在这里详细介绍),看上面截图中黄色方框中我们可以看到默认的库是libcmt.lib证明上面说的是对的,从上面的测试我们还应该认识到一点就是在我们程序开发中各个库或者模块应该统一运行时库否则会出现error 2005井喷,那么此处我们应该怎么办呢?第一就是使用默认的libcmt.lib,第二使用链接选项/NODEFAULTLIB来禁用默认链接库然后再指定我们想要链接的库。

edd2e8efad584fa1548b48e065b22b4a.png

此时可以正常链接成功生成可执行程序helloworld.exe

通常我们生成的程序为了方便调试都会提供一个pdb文件,通过前面测试会发现虽然我们生成了可执行文件但是并没有生成对应的pdb文件,那么通过命令行怎么生成呢?查看命令link查看链接选项在其中找到一个/DEBUG选择,在链接时加入此选项就会生成对应的pdb文件,可通过/pdb:"helloworld.pdb"来设置生成pdb的名称。

2bd76044462dea5a3254242b8f4ac95d.png

对应的vs中的设置是 属性->配置属性->链接器->调试->生成调试信息

da0360c0c0153e0d0e1141766486ed91.png

同样的如果对于一些选项用法不明了可以参照vs来测试使用,在链接器的命令行中包含你设置的链接选项用法

b032350bd4bba4165fb1f2db6a2a73f7.png

其他

dumpbin可以用来查看exe,lib,dll,obj文件的依赖项,导入导出函数等,dumpbin /dependents 文件名 查看依赖库

e0fa37ed910e0b393c396f1f4df3a6a3.png

lib.exe可把def文件生成lib文件,举个列子:

lib /out:F:\CC\def\sqlite3.lib /MACHINE:X64 /DEF:F:\CC\def\sqlite3.def

本文是作为我学习笔记来记录,如有错误请指正,不喜勿喷。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值