【发布时间】:2013-12-02 11:48:11
【问题描述】:
我遇到了英特尔 C 编译器 icc 的问题,它拒绝识别某些标准库,例如 dirent.h。我的代码如下所示:
#include <dirent.h>
...
DIR* dir = opendir(path);
...
readdir(dir);
dirent* entry = readdir(dir);
while(entry != NULL) {
...
entry = readdir(dir);
}
在尝试编译代码时,我收到以下错误,即使我在命令中显式添加-I/usr/include:
icc -g -ipp=common -mkl=parallel -I/opt/intel/ipp/include -I"../include" -std=c99 -openmp -cilk-serialize -fpic -MMD -MP -MF"src/main.d" -MT"src/main.d" -c -o "src/main.o" "../src/main.c"
../src/main.c(85): error: identifier "dirent" is undefined
dirent* entry = readdir(dir);
GCC 编译相同的代码没有任何问题 - 不幸的是,由于其他原因,我需要使用 ICC 编译我的应用程序。
感谢您的建议:)
【问题讨论】:
-
我在基于 Ubuntu Quantal/12.10 的 Linux Mint 14 和具有 icc 版本 13.1.1 的 SuSE SLES 11 上进行了相同的测试。 GCC 版本是 4.3.4 和 4.7.2。
-
您是否尝试过“struct dirent”而不是 dirent?
-
是的,当然。问题只是编译器在第一个错误处停止。如果我没有分配 readdir 的结果,编译器会为 readdir 返回相同的错误消息。我尝试了各种各样的事情并搜索了几个小时的答案。此外,如前所述,相同的代码在 GCC 中完美运行,所以这不是句法问题——尽管投票似乎有点苛刻......
-
如果将
-I"../include"中的相对路径替换为绝对路径呢? -
好的,我正在使用带有英特尔编译器集成工具的 NSight Eclipse 版本,似乎这种奇异的组合导致了奇怪的标志,这弄乱了 dirent.h 中的预处理器语句。从 SSCCE 的终端手动输入 icc 线向我指出了这一点。感谢您的耐心等待!