中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
English/Chinese Fix Translation
作者:
标题: wattcp库无法连接问题 上一主题 | 下一主题
lovehaohui
新手上路





积分 12
发帖 5
注册 2007-3-29
状态 离线
『楼 主』:  wattcp库无法连接问题 [已使用 LLM 解释]

为什么我下的wattcp库没有办法连接
总是找不到函数
我实验ping.c
编译可以通过
但是就是没有办法连接成功~!
那些找不到的函数就是wattcp的库中的函数
我用的是bcc++3.1 但是我tcc3.0也试国了 一样的问题
不知道有没有遇到这种情况~~
LLM 解释

在 Borland C++ 3.1 或 Turbo C 3.0 环境下使用 WATTCP(Waterloo TCP)库时,出现“编译通过但链接失败(找不到函数)”的现象,通常是由开发环境配置、内存模型不匹配或调试符号限制引起的。

1. 内存模型(Memory Model)不匹配

这是 DOS 时代 C 语言编程中最常见的链接错误原因。WATTCP 作为一个网络协议栈,逻辑较为复杂,通常被编译为 Large 内存模型。

  • 技术原理:在 16 位实模式下,Small 模型使用近指针(Near Pointer),而 Large 模型使用远指针(Far Pointer)。如果用户的工程(.prj)设置为了默认的 Small 模型,但引用的 wattcp.lib 是 Large 模型,编译器生成的函数调用约定与库中的符号定义不一致,导致 TLINK(Borland Linker)无法识别对应的导出符号。
  • 解决方法:在 IDE 的 Options -> Compiler -> Code Generation -> Model 中,必须选择与库文件一致的模型(通常是 Large)。

2. 调试符号限制与 Source Debugging 设置

回帖 PID 186351 中提到的将 Source Debugging 设置为 None 是针对 Borland 环境的一个特定限制的修正。

  • 技术背景:当 Source Debugging 选项开启时(默认通常为 OnStandalone),编译器和链接器会尝试在生成的可执行文件中包含行号信息和符号表以便于 IDE 内置调试器使用。
  • 失效原因:WATTCP 库通常体积较大,且包含大量外部符号。由于 Borland 16 位链接器在处理包含大量调试信息的第三方 .lib 文件时,可能会超出其内部符号表容量限制,或者因为库文件本身在编译时没有包含完整的调试信息,导致链接器在尝试重定位(Relocation)调试信息时出错。
  • 操作影响:关闭该选项后,链接器仅处理运行所需的代码和数据段,不再处理 DWARF 或类似的早期调试格式,从而绕过了符号溢出或不匹配的问题。

3. 项目工程文件(.PRJ)配置

在 Borland IDE 环境下,仅仅将库文件放入目录是不够的,必须显式告知链接器。

  • 配置方法:用户需要创建一个 .prj 文件,并将目标源代码(如 ping.c)和 WATTCP 的库文件(如 wattcp.libwattcpwl.lib,其中 wl 代表 WATTCP Large model)同时加入到工程列表中。
  • 命令行模式:如果使用 tccbcc 命令行,需要确保命令行包含了库路径,例如:
    bcc -ml ping.c wattcpwl.lib
    

4. 符号名称的大小写敏感性

Borland TLINK 默认是大小写敏感的。

  • 历史背景:WATTCP 是用 C 语言编写的。如果在 C++ 模式下编译(文件扩展名为 .cpp),编译器会对函数名进行“名改”(Name Mangling)。
  • 预防措施:确保在包含 WATTCP 头文件时使用 extern "C" 块,或者确保源文件扩展名为 .c 以强制使用标准 C 调用约定。

5. 库文件的搜索路径

如果 wattcp.lib 所在的路径没有包含在 Options -> Directories -> Library Directories 中,链接器同样会报找不到符号的错误。在 DOS 环境下,路径长度限制和环境变量(如 LIB)的配置也需严格遵守 8.3 文件名规范。



2007-3-29 09:14
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
lovehaohui
新手上路





积分 12
发帖 5
注册 2007-3-29
状态 离线
『第 2 楼』:   使用 LLM 解释/回答一下

可以了
工程的debug选项要禁止才可以


2007-3-30 05:12
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
automanhxk
新手上路





积分 2
发帖 1
注册 2007-4-10
状态 离线
『第 3 楼』:   使用 LLM 解释/回答一下

请问选项在哪里?我也遇到这个问题,找不到啊


2007-4-10 11:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
cir2633
初级用户





积分 52
发帖 23
注册 2009-12-25
状态 离线
『第 4 楼』:   使用 LLM 解释/回答一下

迟到3年的回答,
__> to automanhxk

你的BC31, option->debugger,
把source debugging选为 none
默认是on


2010-1-29 13:45
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: