Why can't the wattcp library I downloaded connect? It always can't find the function. I experimented with ping.c. The compilation can pass, but it just can't connect successfully. Those functions that can't be found are the functions in the wattcp library. I'm using bcc++ 3.1, but I also tried tcc 3.0, the same problem. I don't know if anyone has encountered this situation.
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 选项开启时(默认通常为 On 或 Standalone),编译器和链接器会尝试在生成的可执行文件中包含行号信息和符号表以便于 IDE 内置调试器使用。
-
失效原因:WATTCP 库通常体积较大,且包含大量外部符号。由于 Borland 16 位链接器在处理包含大量调试信息的第三方
.lib 文件时,可能会超出其内部符号表容量限制,或者因为库文件本身在编译时没有包含完整的调试信息,导致链接器在尝试重定位(Relocation)调试信息时出错。
-
操作影响:关闭该选项后,链接器仅处理运行所需的代码和数据段,不再处理 DWARF 或类似的早期调试格式,从而绕过了符号溢出或不匹配的问题。
3. 项目工程文件(.PRJ)配置
在 Borland IDE 环境下,仅仅将库文件放入目录是不够的,必须显式告知链接器。
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 文件名规范。