如何配置RadASM来支持你的编译器
cao_cong
这两天打算配置一下RadASM来支持一下 LCC-Win32 和 Turbo C++ 3.0,虽然以前给 RadASM 配置过支持VC6的Cpp文件,但当时做完就没管了,我这人又比较懒,不愿写东西,导致现在再配置时很多东西都忘了。这次只好又重新研究了一番,费时费力。配置完LCC后真有点筋疲力尽,不管别的了,先把配置的过程写下来,一是以后要用时可以看看,二也希望写出来让大家看了也能对配置编译器的过程清楚一点,可以自己动手来配置RadASM支持自己喜欢的编译器。Turbo C++ 3.0 的配置我已经不太想继续干了,谁有兴趣配置好了的话别忘了给我发一份。 在配置一个编译器之前,首先你要了解你所用的编译器编译、连接、资源编译程序的命令行选项,这样你配置时才能有的放矢。要知道相关程序的命令行选项的话你只需在命令提示符中输入相关程序就可得到。我一般喜欢在后面加一个 /? 参数。如这样:lcc.exe /? 。在控制台窗口中右击鼠标,把显示的命令行选项全选后复制到新建的一个文本文件,以便参考。我这次就以我配置的LCC编译器支持文件来作为模板,对各个部分进行讲解,可能比较罗嗦,主要还是想说清楚一点,让大家少走弯路。有什么说得不对的地方还请大家指正。另外我在配置时RadASM中提到的菜单及选项等都是基于我自己汉化的RadASM来谈的,如果给你造成了什么歧义的话,还请多多原谅。不浪费大家时间了,下面进入正题: 在开始之前,我把LCC-Win32 的命令行选项列出来(我都翻译过了),以便大家对照: ------------------------------------------------------------------------- lcc.exe(编译程序) 命令行: 选项 含义 -A 激活所有警告. -ansic 禁用lcc-win32的语言扩展. -D D后面跟随定义的符号. 例如:-DNODEBUG 定义 NODEBUG 符号. 注意: 在D和符号间没有空格 -check 检查给定源文件的错误. 不生成目标文件. -E 生成一个中间文件及预处理程序输出.输出文件名将根据输入文件名来生成, 如,编辑 foo.c 你将得到foo.i. -E+ 类似于 -E 选项, 还会生成一个#行号 xxx 指令,预处理程序生成一个 # xxx 指令. -EP 类似 -E 选项,但不生成 #行号 指令. -errout= 附加警告/错误信息到指定的文件.如 -errout=Myexe.err.将把所有警告和错误信息附加到 Myexe.err 中。 -eN 设置最大错误数N. 例如:-e25. -fno-inline 忽略内联指令. -Fo<文件名> 强制输出文件名. -g2 生成调试信息. -g3 支持函数堆栈跟踪. 如果遇到一个中断,将显示函数堆栈. -g4 支持函数堆栈及行号跟踪. -g5 支持函数堆栈,行号及返回调用堆栈崩溃跟踪. -I 把一个路径添加到包含的路径,如编译器查找头文件的路径.例:-Ic:\project\headers. 注意在I和后面跟随的路径之间没有空格. -libcdll 使用用于 lcclibc.dll 的声明.用此选项编译的文件要在连接器 lcclnk 中使用 -dynamic 选项. -M 在标准输出中显示当处理给定的输入文件时预处理程序打开的所有文件.不生成目标文件. -M1 在标准输出中递归显示每个 include 文件,指出其调用自何处,何时关闭. -nw 不显示警告.错误仍将显示. -O 优化输出. 这将启动 peephole 优化器. -o <文件>用于给定输出文件的名称.与上面的 Fo 参数相同. -overflowcheck 生成代码测试所有加,减,乘的溢出. -p6 启用 Pentium III 指令 -profile 注入代码到已生成的程序中来测试执行时间.此选项不兼容调试级别高于 2 的程序. -S 生成一个汇编文件. 输出文件名依赖于输入文件.如:编辑 foo.c 你将得到 foo.asm. -s n 设置转换密度为 n ,值必须在 0.0 和 1.0 之间. 如: -s 0.1 -shadows 当一个本地变量覆盖了一个全局变量时警告. -stackinit n 函数入口值为 "n" 时初始化未初始化的堆栈. -U 未定义符号跟随在U后面. -unused 警告未使用的分配并禁止垃圾代码. -v 显示编译器版本和编辑日期 -z 生成一个 LCC 中间语言的文件.生成的文件以 .lil 为扩展名. -Zp[1,2,4,8,16] 设置结构的默认队列为一, 二, 四,等. 如果你设为一,实际上等于无队列. ------------------------------------------------------------------------- 命令行选择区分大小写.使用 "-" 或 "/" 在 命令行中引入选项.
------------------------------------------------------------------------- lcclnk.exe(连接程序) 命令行: Lcclnk 命令行选项.使用 "-" 或 "/" 在命令行中引入选项. -o <文件名> 设置输出文件名称.请在 o 和文件名间插入一个空格. -errout<文件名> 把所有警告/错误信息写入到指定名称的文件. -subsystem <subsystem> 指出输出文件类型. Console 或 windows 程序 -stack-commit <数字> 选择此选项,你可以提交多于一个的页面(4096 字节). -stack-reserve <数字> 默认堆栈大小为 1MB. 用此选项改变限制. -dynamic 使用 lcclibc.dll 作为默认库并动态链接到程序,用以代替连接到 libc.lib. -dll 此选项告诉连接程序这是一个 .dll 文件而不是一个 .exe 文件. -map <文件名> 指定 map 文件名.此选项不兼容 -s 选项. -nolibc 不包括标准 C 程序库. -s 从程序中去除所有符号和调试信息. -version nn.nn 为程序添加版本号. -errout=<文件名> 写入所有警告或错误到给定名称的文件.注意在文件名和等号间没有空格. -nounderscores 例如创建一个用于 Visual Basic 的 DLL 时,最好 DLL 的输出函数名没有下划线. -entry <fnname> 设置 DLL 的入口点函数 -version 输出版本名称
------------------------------------------------------------------------- lcclib.exe(编译库(Lib)的工具) 命令行: 格式: lcclib <libfile.lib> <目标文件> 选项: /out:输出文件 /extract:目标 /remove:目标 /verbose: 显示输出过程 默认同名的目标文件将被替换
------------------------------------------------------------------------- lrc.exe(编译资源脚本的程序) 命令行:
用法: lrc [选项] .RC 输入文件 选项: /r: 生成 .RES 文件.这是预设好的... /v: 显示细节(Verbose) /z: 生成一个 .map 文件.名称依赖于输入文件 /d: 定义符号 /o: 输出到指定文件. ’o’ 和文件名间没有空格 /fo: 输出到指定文件. ’o’ 和文件名间没有空格 /l: 默认语言号 后面应立即跟随十进制的语言号.’l’和语言号之间没有空格 /i: 添加一个 include 路径. ’i’和路径间没有空格 /a: 写打包文件(图标,位图, 等等) 选项不区分大小写 ------------------------------------------------------------------------- 配置一个让RadASM支持的编译器只需写一个INI文件,把各个段配置好。配置好后放在RadASM目录,直接在RadASM的菜单选项->编程语言中把你的配置文件添加进去就可以了。我这里把配置的文件命名为Lcc.ini,我把每个段都列出来(列主要我们要配置的部分),各个段的含义我在每个列出的段后用“//”开头的注释说明。 [Description] 1=Lcc Win32
//这个段是对你配置的编译器描述,你可以随便写。
[Enviroment] 1=path,C:\Lcc\Bin;
//这相当于环境变量,RadASM会到path后面指定的路径查找相关程序。
[CharTab] 2=0251222522222236;20-2F 3=1111111111222221;30-3F
//字符表定义,0到127的默认字符表,与我们没多少关系,随便在RadASM中找一个配置好的编译器支持文件复制过来就行了。
[Open] 0="C++ 文件 (*.c;*.cpp;*.h),*.c;*.cpp;*.h" 1="资源文件 (*.rc),*.rc" 2="文本文件 (*.txt),*.txt" 3="宏文件 (*.dsm),*.dsm" 4="所有文件 (*.*),*.*" src="C++ 文件 (*.cpp),*.cpp,cpp" hdr="头文件 (*.h),*.h,h" mod="模块 (*.cpp),*.cpp,cpp"
//工程中默认打开的文件类型列表,根据你的编译器源文件类型进行修改。
[CodeMacro] ;关键字,活动行前插入,活动行后插入 ;{I}=从关键字行复制缩进 ;{C}=回车符 ;{S}=空格符 ;{T}=制表符 ;{$}=复制 Proc/Struct 名称 ;宏的设置默认已开启自动缩进 1=if(),{{C}{T},{C}{I}} 2=else,{T}, 3=elseif,{T}, 4=while,{T},{C}{I} ;5= 6=$Content$nbsp;),{{C}{I}{T},{C}{I}} 7=struct $,{T},{C}{I}} 8=for(),{{C}{T},{C}{I}} 9={,{T},{C}{I}} ;10=
//这个段称之为代码宏,就是当你在RadASM的编辑器中输入代码时根据你的输入自动完成的内容。“;”后为注释,我翻译了一下。我们选1=if(),{{C}{T},{C}{I}}这条来讲解一下其含义:1是序号,不用多说,if(),{{C}{T},{C}{I}}是指当我在编辑器中输入if()回车后,首先在第二行开始输出一个“{”再自动回车到下一行开始输出一个制表符,再回车到第四行把第一行的if()开始位置复制过来,后面跟一个“}”,光标的位置定位在第二行的制表符后。实际效果如下: if() { //光标位置 } if(),{{C}{T},{C}{I}}中if()是指自动完成时的关键字,紧跟在逗号后的{{C}{T}指在活动光标前插入的字符,最后的{C}{I}}是指在活动光标后插入的字符。在这个段中的{$}是用来复制函数或结构名称的。我在6=$Content$nbsp;),{{C}{I}{T},{C}{I}}中配置的$Content$nbsp;)是希望我输入一个函数并加 )后能自动给我完成的,可惜好象工作的不好,只对汇编的编译器有效。
[1] [2] [3] 下一页 |