精易论坛

标题: 【简单静态支持库开发】一、简单认识 Visual C++ [打印本页]

作者: 镇坛道德标杆    时间: 2018-6-7 03:00
标题: 【简单静态支持库开发】一、简单认识 Visual C++
这个标题写得有点大,实际上本文只是结合易简单认识一下 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”.
同时我们可以发现
"D:\BackUp\E\1.res"



这两个文件由于 retain_intermediate_files 参数的设置, 没有在编译完成后被删除.
其中 .obj 文件就是编译器生成的 目标代码, 而 .res 文件则是资源文件, 里面有图标等资源, 关于这个我在 在编译的时候修改掉默认的”易”图标以及”易语言程序”的描述 这个帖子中有简单的反编译利用, 我也不甚擅长不在此讨论.


补充内容 (2018-6-9 11:50):


作者: 饭没了秀    时间: 2018-6-14 17:22
能否换其它编译器呢?
作者: 人生VS征途    时间: 2018-7-17 21:52
精品  谢谢楼主给大家分享




欢迎光临 精易论坛 (https://bbs.125.la/) Powered by Discuz! X3.4