cl命令行编译与链接子系统

来源:互联网 发布:艾默生网络被收购 编辑:程序博客网 时间:2024/05/27 14:11

虽说我们平时在vs中建好工程后,直接选择生成解决方案,就可以完成整个工程的编译,不用写makefile, 也不用指定各种头文件和库的路径问题,但偶尔也想玩玩怎么通过命令行直接使用cl进行编译,以便更好的了解整个工程的编译过程。

直接WIN+R,输入“cmd”,打开命令行窗口,输入cl ,返回:'cl' 不是内部或外部命令,也不是可运行的程序或批处理文件。这个问题很好理解,找不着路径嘛,cd到cl所在的目录,或者直接在path环境变量中添加就可以了,输入

"set path=%path%;C:\ProgramFiles\Microsoft Visual Studio 10.0\VC\bin;"
 ,或者高级系统设置->环境变量->系统变量->path中添加

C:\ProgramFiles\Microsoft Visual Studio 10.0\VC\bin;"

再运行cl测试一下,令人郁闷的问题出现了,“无法启动此程序,因为计算机中丢失mspdb100.dll。尝试重新安装该程序以解决此问题”,好吧,搜一下这个文件,竟然在C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE目录下,继续添加到系统path环境变量,终于安静了。

事情还远没有结束。

尝试编译一下程序,

cl /EHsc hello_cl.c user32.lib

这个世界总是如此不安静,又找不到windows.h,什么,又要添加INCLUDE, LIBPATH环境变量?可以参考这篇文章:

http://technet.microsoft.com/zh-cn/library/kezkeayy(v=vs.110).aspx

折腾了一会之后,发现还是不成功,记得大概3年前就成功的在vim下鼓捣,竟然让我成功的直接在vim中调用cl对源代码进行编译,可惜,当时不做笔记,现在倒好,竟然忘了怎么整了,只是依稀记得当时参考了工程属性中的“C/C++”->"命令行"和"链接器"里所使用的参数。看来好记性不如烂笔头,所以,就有了这篇博文了。以前一直觉得写出来的都是垃圾,与其在互联网上增加垃圾信息,影响在苦苦搜索问题解决方案的程序猿们,自己对搜索是遇到的垃圾信息心里本身就很抵触,己所不欲勿施于人,所以,虽然知道程序猿应该写自己的博客,但是,一篇博文的都没写过。后来思想有点慢慢的转变了,写博文是对自己负责,至于造成互联网上垃圾信息的增加,而如果您又刚好见到这篇文章,而且还得不到任何有效的信息,浪费了您的时间,我只能说,太抱歉了。

好吧,这会儿我要研究的是的 Console 和 Windows 两个链接子系统,命令行选项不是我的主题,就偷会懒,暂且放过它吧。

偷懒的方式:

C:\Program Files\Microsoft Visual Studio 10.0\VC\bin目录下找到vcvars32.bat文件,用文本编辑器打开该文件,发现第一行是

Setting environment for using Microsoft Visual Studio 2010 x86 tools.
这不正是我所苦苦追求的目标嘛,直接拷贝到工程目录下,cd到要编译的工程目录,运行该文件,OK,编译环境设好了,接下来该进入正题了,继续运行

cl /EHsc hello_cl.c user32.lib
终于成功了。

链接子系统,大概说一下,紧作为笔记。

windows下有两个链接子系统,分别是 Console 和 Windows,一般来说,如果我们的程序入口是main的话,链接是制定Console子系统,如果入口是WinMain,及Win32 Application的话,指定Windows子系统,至于MFC,其实入口还是WinMain,只是,人家帮我们封装好了,就不劳我们分心了。但是,也不是绝对的,控制台程序也可以指定WinMain入口,Win32程序,也可以指定main入口。

指定链接系统的方式:

1. cl后添加链接参数选项/link /subsystem:windows, cl /EHsc xxxx.cpp /link /subsystem:windows: 指定Windows子系统

2. cl后添加链接参数选项/link /subsystem:console , cl /EHsc xxxx.cpp /link /subsystem:console : 指定控制台程序

指定程序入口的方式:

/entry:WinMainCRTStartup和 /entry:mainCRTStartup


附带记一下mingw gcc编译指定链接子系统的方式,

gcc默认使用控制台链接子系统,指定方式

-Wl,-subsystem,console,可用 -mconsole 替代
-Wl,-subsystem,windows 可用 -mwindows 替代

关于链接子系统更详细的文章请参考:

浅谈Console与Windows子系统

Qt Windows下链接子系统与入口函数(终结版)