在 CentOS 上让 readdir(更准确说是 readdir / opendir / readdir_r 这套目录读取接口)兼容 32 位程序,通常有以下几种情况和做法,取决于你“兼容”的具体含义。
64 位 CentOS 默认不装 32 位库。
# CentOS 7
yum install glibc.i686
# CentOS 8 / Stream
dnf install glibc.i686
如果是自己编译的程序,还需要:
yum install glibc-devel.i686
✅ 正常情况下是兼容的
readdir() 在 32 位和 64 位下接口一致struct dirent 的差异⚠️ 注意:
EOVERFLOW_FILE_OFFSET_BITS=64(推荐)在 32 位系统/程序 中,让 readdir 自动使用 64 位版本:
#define _FILE_OFFSET_BITS 64
#include <dirent.h>
或编译时:
gcc -D_FILE_OFFSET_BITS=64 -m32 test.c
效果:
readdir → readdir64struct dirent → struct dirent64✅ 这是最推荐的“兼容方式”
#define _LARGEFILE64_SOURCE
#include <dirent.h>
DIR *dir = opendir64("/path");
struct dirent64 *entry;
while ((entry = readdir64(dir)) != NULL) {
...
}
⚠️ 注意:
readdir 和 readdir64yum install glibc-devel.i686
gcc -m32 main.c -o main32
gcc -m32 -D_FILE_OFFSET_BITS=64 main.c -o main32
gcc -m64 main.c -o main64
| 问题 | 原因 | 解决 |
|---|---|---|
readdir 返回 NULL |
32 位偏移溢出 | _FILE_OFFSET_BITS=64 |
undefined reference |
没装 32 位库 | glibc.i686 |
| 64 位程序读 32 位目录异常 | 实际是权限/文件系统问题 | 不是 readdir 问题 |
| NFS 目录异常 | NFS + 32 位 | 用 64 位接口 |
CentOS 上 readdir 兼容 32 位的正确做法是:
- 装
glibc.i686- 编译时加
-m32 -D_FILE_OFFSET_BITS=64- 不要手写
readdir64,除非必要
如果你能说明:
我可以给你更精确的方案。