Cygwin下gcc链接提示cannot find -lnsl错误如何解决
问题根因
Cygwin 环境没有单独分发 libnsl 库:传统类Unix系统中libnsl提供的网络名称服务、基础RPC运行时依赖,在Cygwin生态里已经合并到默认链接的标准C库,不需要额外通过-lnsl链接。你当前的报错就是链接器找不到不存在的独立libnsl库导致的。
另外你当前混用GnuWin32版rpcgen生成的桩代码和Cygwin编译工具链,还要注意ABI兼容问题。
修复步骤
- 修改Makefile的链接配置,直接删除
LDLIBS行里的-lnsl参数,基础配置参考如下:
# Compiler flags CC = gcc CFLAGS += -g LDLIBS += RPCGENFLAGS =
- 清理旧构建产物:如果Makefile里有clean规则就执行
make clean,没有的话手动删除所有生成的.o目标文件、旧的可执行文件,再重新执行构建命令。 - 如果重新构建时出现RPC相关函数(比如
clnt_create、各类xdr_*序列化函数)的未定义引用,打开Cygwin的安装程序setup-x86_64.exe,搜索安装libtirpc-devel包,安装完成后修改Makefile补充对应依赖:
# Compiler flags CC = gcc CFLAGS += -g -I/usr/include/tirpc LDLIBS += -ltirpc RPCGENFLAGS =
再次清理旧构建产物后重新编译即可。
注意:GnuWin32编译的二进制、静态库和Cygwin工具链的ABI不兼容,如果后续出现符号格式不匹配、内存访问异常的问题,直接在Cygwin安装源里搜索安装
rpcgen包,用Cygwin原生的rpcgen重新生成客户端、服务端桩代码,从根源规避兼容性问题。
内容的提问来源于stack exchange,提问作者shravani
相关产品推荐
相关产品推荐

