【问题标题】:Intel C Compiler unable to use standard libs (e.g. dirent.h) on Linux英特尔 C 编译器无法在 Linux 上使用标准库(例如 dirent.h)
【发布时间】: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 线向我指出了这一点。感谢您的耐心等待!

标签: c linux icc


【解决方案1】:

在 C 语言中,您必须在 C 块 {} 的开头声明变量。您不能在指令之间交错声明。

【讨论】:

  • 这不再是必要的。您使用的是非常旧的编译器。
猜你喜欢
  • 1970-01-01
  • 2012-02-27
  • 2016-09-04
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多