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下链接子系统与入口函数(终结版)
- cl命令行编译与链接子系统
- 命令行下cl.exe编译链接的问题及解决方法
- cl命令行编译Cpp
- cl 命令行编译 rc 版本
- cl命令行编译C++程序
- Visual Stdio命令行程序与窗口程序链接子系统
- windows命令行编译 —— cl编译
- VC6.0命令行 cl 编译配置
- 编写简单DLL及CL编译链接
- CL 与 LINK的命令行用法
- 几个VS编译器(cl.exe)命令行编译的例子
- 几个VS编译器(cl.exe)命令行编译的例子
- Windows下在命令行实现cl.exe编译代码
- Microsoft Visual Studio 命令行 编译 cl link rc
- 在命令行界面使用vs2008的 cl 进行编译
- 个VS编译器(cl.exe)命令行编译的例子
- Windows命令行调用微软cl编译C/C++程序
- 几个VS编译器(cl.exe)命令行编译的例子
- 统计学习方法
- Qt容器使用
- 响应式Web设计(二):响应式Web设计的概念
- 文件重定向
- 非常有用的一些objective-c知识点
- cl命令行编译与链接子系统
- 关于显式调用DLL、隐式调用DLL和查看DLL输出函数
- 成员函数的重载、覆盖、隐藏
- 如何进行软件架构设计?
- 分数和整形数的四则运算
- ImageSwitcher、Gallery、自定义对话框等UI组件的综合运用
- eventlet学习
- 【Android】 AndroidManifest.xml 结构详解
- Learning CCNA - Chapter 2: Introduction to TCP/IP