在Vivado中使用xsc编译器添加C链接器时出现错误
解决Windows下Vivado DPI调用TCP客户端时的未定义引用错误
问题概述
在Windows环境下基于Vivado和SystemVerilog开发DPI原型:外部启动Python TCP服务器,仿真时SystemVerilog调用C程序的cFunc函数实现TCP客户端逻辑。但仿真时出现大量Windows Socket API函数的未定义引用错误,具体错误如下:
./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0x22): undefined reference to `__imp_WSAStartup' ./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0x55): undefined reference to `__imp_socket' ./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0x7b): undefined reference to `__imp_WSACleanup' ./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0xb6): undefined reference to `__imp_htons' ./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0xde): undefined reference to `inet_pton' ./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0xff): undefined reference to `__imp_closesocket' ./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0x108): undefined reference to `__imp_WSACleanup' ./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0x132): undefined reference to `__imp_connect' ./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0x156): undefined reference to `__imp_closesocket' ./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0x15f): undefined reference to `__imp_WSACleanup' ./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0x1ab): undefined reference to `__imp_send' ./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0x1cf): undefined reference to `__imp_closesocket' ./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0x1d8): undefined reference to `__imp_WSACleanup' ./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0x205): undefined reference to `__imp_recv' ./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0x233): undefined reference to `__imp_closesocket' ./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0x23c): undefined reference to `__imp_WSACleanup' ./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0x276): undefined reference to `__imp_closesocket' ./xsim.dir\work\xsc\dpi.a(function.win64.obj):function.c:(.text+0x27f): undefined reference to `__imp_WSACleanup'
已尝试的操作:C程序中引入了winsock2.h头文件,run.bat脚本中添加了链接器选项:
call %install_root%\bin\xsc function.c --gcc_link_options -Lws2_32 "C:\\Windows\\System32"
问题原因
错误源于两个核心问题:
- 链接器参数使用错误:
-Lws2_32是指定库搜索路径,而非链接具体库;正确链接Windows Socket库的参数是-lws2_32(小写字母L),用于告诉链接器链接ws2_32.lib。 - 头文件缺失:
inet_pton函数需要ws2tcpip.h头文件,仅引入winsock2.h无法正确声明该函数。
解决方案步骤
1. 修正链接器参数
修改run.bat中的xsc命令,将链接选项改为正确的库链接参数:
call %install_root%\bin\xsc function.c --gcc_link_options -lws2_32
说明:-lws2_32会让链接器自动在系统标准库路径中查找并链接ws2_32.lib,无需手动指定C:\\Windows\\System32路径。
2. 完善C代码头文件引用
在C程序的头文件部分添加必要的宏定义和头文件,确保Socket API函数被正确声明:
#define _WIN32_WINNT 0x0600 // 启用Windows Vista及以上版本的Socket API #include <winsock2.h> #include <ws2tcpip.h> // 提供inet_pton等函数的声明
说明:定义_WIN32_WINNT宏可以避免版本兼容性问题,确保编译器识别inet_pton等较新的Socket函数。
3. 清理并重新编译
- 删除Vivado仿真生成的中间文件目录
xsim.dir - 重新运行run.bat脚本,启动仿真
完成以上步骤后,未定义引用错误应完全消除,TCP客户端逻辑可正常与Python服务器通信。
内容的提问来源于stack exchange,提问作者Namratha
相关产品推荐
相关产品推荐

