Turbo C++编译链接报错‘No DOS extensions in the DPMI server’求助
问题解决步骤
一、修复「no DOS extensions in the DPMI server」错误
这个错误是因为程序运行需要DPMI(DOS保护模式接口)支持,但DOSBox默认未加载对应服务程序,可按以下方式解决:
- 在DOSBox中先运行Turbo C++配套的DPMI服务器程序:
\Compiler\BIN\CWSDPMI.EXE,加载完成后再执行你的编译生成的EXE文件。 - 确认编译模式:你使用了
-ml(large内存模型),Turbo C++ 3.0的16位large模式程序依赖DPMI环境,若不需要大内存模型,可尝试改用-ms(small模型)编译测试,同时确保汇编代码的.MODEL指令同步修改为small。
二、修复TLINK链接错误(修改名字修饰后)
你通过extern "C"和将汇编符号改为_factorial解决了C++名字修饰问题,现在TLINK报错大概率是以下场景,对应处理:
1. 内存模型不匹配
- 确保C代码与汇编代码使用完全一致的内存模型:汇编中用了
.MODEL large,C编译必须保留-ml参数,不能遗漏。 - 单独编译汇编文件时需指定模型:用TASM编译时加
/ml参数,命令为:TASM /ml /c factorial2.asm(/c表示只编译生成OBJ文件,不链接)。
2. 符号定义/声明不一致
- 检查汇编中
EXTRN _n:word:C的全局变量n是int类型,在Turbo C 3.0的large模式下int为16位(对应汇编的word),该声明正确,确保C++代码中n确实是全局变量,未被误定义为局部变量。 - 确认汇编中
PUBLIC _factorial:必须明确声明该符号为公共符号,拼写需与C++中extern "C" int factorial();完全一致(DOS环境大小写不敏感,但尽量保持统一)。
3. TLINK命令参数错误
建议分步编译链接,避免TCC自动调用时的参数问题:
- 编译C++文件:
TCC -c -ml -I\Compiler\INCLUDE factorial1.cpp
- 编译汇编文件:
TASM /ml /c factorial2.asm
- 手动执行TLINK链接:
TLINK /ml \Compiler\LIB\c0l.obj factorial1.obj factorial2.obj, factorial.exe, , \Compiler\LIB\clib.lib
参数说明:
/ml:指定large内存模型c0l.obj:large模型的程序启动代码,必须放在OBJ列表最前面clib.lib:large模型的C标准库文件- 格式规则:
TLINK [选项] 启动代码.obj 你的OBJ文件..., 输出EXE文件名, 映射文件名, 依赖库列表
4. 库文件路径或缺失问题
确保TLINK能找到c0l.obj和clib.lib,如果\Compiler\LIB路径正确则无需修改,若无法识别,直接写入完整路径即可。
补充验证
- 生成EXE后,务必先加载
CWSDPMI.EXE再运行程序,避免再次触发DPMI错误。 - 如果仍报错,记录TLINK的具体错误信息(比如「Undefined symbol _factorial」「Segment size exceeds limit」等),可进一步精准定位问题。
内容的提问来源于stack exchange,提问作者Kien Nguyen
相关产品推荐
相关产品推荐

