这个标题写得有点大,实际上本文只是结合易简单认识一下 Visual C++ .
导语本文结合易简单认识一下 Visual C++ .
作为一个 IDE, VS 常被冠以“宇宙IDE”的称号, 发展到如今的 VS2017, 其强大完全不是我能窥一豹的, 但是此处, 仅对于易而言, 我们只谈关于静态编译这一小部分(而且是这一小部分之中的一小部分, 有点拗口但确实如此). 编译器Visual C++ 的编译器 通常 为 cl.exe, 当然并不全是如此, 例如 VS2015 开始支持 clang 编译. 链接器Visual C++ 的链接器 通常 为 link.exe, 同理也并不全是如此. 对应易的静态编译我们在这里”抽象”一下, 假设整个静态编译的过程只由 编译器 和 链接器 组成, 那么, 易的静态编译对应 Visual C++ 的静态编译就是: * 编译器的工作归 e.exe 完成
* 链接器的工作归 link.exe 完成
如果对此过程不够清晰直观, 那么跟随我来做这样的操作: * 新建一个 .e , 不用写什么代码, 默认即可
* 打开易的安装目录下的 tools\link.ini(注意:如果第一步是用非管理员权限打开的 e.exe, 那么 link.ini 在 *%USERPROFILE%\AppData\Local\VirtualStore\Program Files (x86)\e\tools\link.ini)
* 修改 show_command_line=yes
* 修改 retain_intermediate_files=yes
* 保存 link.ini
* 回到第一步新建的 .e, 选择静态编译
可以观察到输出了一段命令行: 命令行:"C:\Program Files (x86)\e\linker\VC98linker\bin\link.exe" "D:\BackUp\E\1.obj" "C:\Program Files (x86)\e\static_lib\krnln_static.lib" kernel32.lib user32.lib gdi32.lib winmm.lib msimg32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib "D:\BackUp\E\1.res" /LIBPATH:"C:\Program Files (x86)\e\static_lib" /nologo /machine:I386 /subsystem:windows /out:"D:\BackUp\E\1.exe"
很容易理解: 实际上就是调用 link.exe 对编译器(也就是 e.exe)生成的 .obj 进行链接, 得到最终的可执行文件. 换句话说, 如果在此处将生成的 “D:\BackUp\E\1.exe” 删除, 然后在 cmd 中执行上面的命令行, 一样能成功生成 “D:\BackUp\E\1.exe”.
这两个文件由于 retain_intermediate_files 参数的设置, 没有在编译完成后被删除. 其中 .obj 文件就是编译器生成的 目标代码, 而 .res 文件则是资源文件, 里面有图标等资源, 关于这个我在 在编译的时候修改掉默认的”易”图标以及”易语言程序”的描述 这个帖子中有简单的反编译利用, 我也不甚擅长不在此讨论.
补充内容 (2018-6-9 11:50):
|