Cygwin程序加载共享库显示“?”缺失,如何排查?
有时Cygwin程序运行时会因缺少库文件报错:
error while loading shared libraries: name-of-library: cannot open shared object file: No such file or directory
但也会遇到库文件名显示为“?”的情况,示例如下:
$ cmake -DCMAKE_BUILD_TYPE=Release .. C:/cygwin64/bin/cmake.exe: error while loading shared libraries: ?: cannot open shared object file: No such file or directory
使用ldd命令检查时,显示所有依赖库均存在:
$ ldd /usr/bin/cmake.exe ntdll.dll => /cygdrive/c/Windows/SYSTEM32/ntdll.dll (0x7ffff28f0000) KERNEL32.DLL => /cygdrive/c/Windows/System32/KERNEL32.DLL (0x7ffff27f0000) KERNELBASE.dll => /cygdrive/c/Windows/System32/KERNELBASE.dll (0x7ffff0460000) cygarchive-13.dll => /usr/bin/cygarchive-13.dll (0x48dc20000) cyggcc_s-seh-1.dll => /usr/bin/cyggcc_s-seh-1.dll (0x3ff3d0000) cygwin1.dll => /usr/bin/cygwin1.dll (0x7fffba470000) cygstdc++-6.dll => /usr/bin/cygstdc++-6.dll (0x3fdd60000) cygjsoncpp-25.dll => /usr/bin/cygjsoncpp-25.dll (0x54b920000) cygcurl-4.dll => /usr/bin/cygcurl-4.dll (0x3ff770000) cygrhash-0.dll => /usr/bin/cygrhash-0.dll (0x7fffca6b0000) cyguv-1.dll => /usr/bin/cyguv-1.dll (0x4c6110000) cygz.dll => /usr/bin/cygz.dll (0x3fd7a0000) cygbz2-1.dll => /usr/bin/cygbz2-1.dll (0x3ffef0000) cygcrypto-3.dll => /usr/bin/cygcrypto-3.dll (0x3ff830000) cygiconv-2.dll => /usr/bin/cygiconv-2.dll (0x3fee20000) cyglz4-1.dll => /usr/bin/cyglz4-1.dll (0x3fea90000) cyglzma-5.dll => /usr/bin/cyglzma-5.dll (0x3fea50000) cygxml2-2.dll => /usr/bin/cygxml2-2.dll (0x3fd7e0000) cygzstd-1.dll => /usr/bin/cygzstd-1.dll (0x3fd6f0000) cygbrotlidec-1.dll => /usr/bin/cygbrotlidec-1.dll (0x3fff10000) cygidn2-0.dll => /usr/bin/cygidn2-0.dll (0x3fed80000) cyglber-2.dll => /usr/bin/cyglber-2.dll (0x3febe0000) cyggsasl-18.dll => /usr/bin/cyggsasl-18.dll (0x3feff0000) cyggssapi_krb5-2.dll => /usr/bin/cyggssapi_krb5-2.dll (0x3fefa0000)
具体排查步骤
用
cygcheck递归检查依赖
执行cygcheck /usr/bin/cmake.exe,这个工具会逐层扫描所有直接和间接依赖,能发现ldd遗漏的缺失库或版本不兼容问题,比如某个依赖库的子依赖未安装。验证库文件的权限与完整性
用ls -l /usr/bin/cyg*.dll查看目标库的权限,确保当前用户有读取权限;如果怀疑文件损坏,通过Cygwin的setup.exe重新安装对应库包,修复损坏文件。排查Windows系统DLL问题
报错中的?也可能是Windows系统DLL缺失或版本不兼容。检查ldd输出里的Windows DLL(如ntdll.dll)是否存在,或者更新Windows系统补丁修复系统文件。用
strace追踪加载流程
运行strace cmake -DCMAKE_BUILD_TYPE=Release ..,查看程序加载库的系统调用细节,即使库名显示为?,也能从调用日志里定位到具体的加载路径或出错的库信息。检查Cygwin环境变量
用echo $PATH确认/usr/bin和/bin在PATH最前端,避免系统优先加载其他路径下的同名DLL导致冲突;若路径不对,临时执行export PATH=/usr/bin:/bin:$PATH修复。
内容的提问来源于stack exchange,提问作者Ole Tange

