【问题标题】:How do I fix Eclipse CDT Error "Function 'isdigit' could not be resolved" with Android NDK?如何使用 Android NDK 修复 Eclipse CDT 错误“无法解析函数‘isdigit’”?
【发布时间】:2012-06-01 02:28:18
【问题描述】:

我将 Eclipse Indigo 与 Android/NDK 混合项目一起使用。我添加了 C++ 特性,几乎一切正常。自动构建工作;也就是说,当我编辑一个文件时,ndk-build 被调用并成功完成 - 没有构建错误。鼠标悬停代码辅助工作(小窗口弹出有关该功能的信息)。如果我将光标放在包含行上并按 F3,则会打开一个相关的头文件(根据我的配置,不是我期望的那个,而是一个相关的 - 也许是一个线索?)。

如果我在 .cpp 文件中选择以下行,它会打开 $NDKROOT/platform/android-3/arch-arm/usr/include/ctype.h:

#include <ctype.h>

(isdigit在这个文件中定义)

然而,Eclipse 坚持 isdigit 没有定义。我已经阅读了许多帖子,表明应该归咎于静态分析器或索引器,但我尝试了许多建议的解决方案均无济于事。

如果我添加如下一行,错误就会消失,并且该函数的鼠标悬停代码辅助工作:

extern int isdigit(int);

同样,这不是链接器错误或编译器错误 - ndk-build 完成时没有错误。这是eclipse里面的东西。感谢您的观看!

编辑:我现在认为这是一个代码分析问题。更好的解决方案是编辑代码分析选项以使“无法解析功能”成为警告而不是错误。这样您就可以在“问题”视图中看到警告,但可以继续工作。如果函数真的丢失了,编译器会告诉你的!我还有一个新理论,即问题出在符号链接之后的代码分析器上,因为所有“缺失”的函数都在符号链接的包含文件中。希望对这个理论有任何意见。

【问题讨论】:

  • 我猜这将在 Kepler 中修复?

标签: android eclipse android-ndk java-native-interface eclipse-cdt


【解决方案1】:

在花了几天时间解决此类问题后,我开发了以下解决问题的方法。

希望对你或其他人有所帮助:

总结:通常,您在eclipse 中的问题是由于eclipse 配置问题造成的。以下假设您的 C++ 代码可以使用 ndk_buildndk_build.cmd(在 Windows 上)构建。

  • eclipse juno (4.2) 和 CDT 8.1 版没有乐趣。使用日食靛蓝(3.7)

  • 通过查看“安装新软件”,确保您已安装并启用了 CDT for indigo(版本 8.0X)。它默认为已安装,但在某些下载的 indigo 上启用。

  • 1234563一。它具有欺骗性,但在 Java 透视图中只有一部分选项可用。如果您在执行“项目 > 属性”时看到“C/C++ 通用”选项,则可以确定您是 C++/C 视角。
  • 通常的问题是 C/C++-land 中的索引器在没有错误时认为存在错误(例如,使用 ndk-build 构建工作正常,通常您甚至可以在控制台窗口中看到这一点)。这是由第一个选项卡上“项目 > 属性 > C/C++ 常规”的“路径和符号”部分中的错误路径引起的。

  • 要解决此问题,主要工具是右键单击项目,选择“索引”和“搜索未解决的包含”。这将告诉它找不到哪些文件 - 这些文件通常不是您在文件中带有小粉红色标记的文件。

  • 要找到正确的文件,请在 NDKROOT 目录(安装 NDK 的位置)中搜索。一个典型的添加是:${NDKROOT}/platforms/android-9/arch-arm/usr/include 或您的 android 目标的正确 android-N。由于 android 的多个版本和 C++ 标准库的副本,NDK 中有许多标准包含目录的副本。

两个大警告

  • 当您在“属性”>“C/C++ 常规/路径和设置”上更改索引器配置时,Eclipse 中的“未解决的包含”视图不会自动更新,因此请务必再次运行它每一次。 eclipse 中的大多数视图都能正确更新!

  • 此外,Eclipse 编辑器中源代码视图中的红色/粉色小错误标记也不会自动更新。您必须以某种方式“触摸”该文件,它才会发现错误现已修复。

【讨论】:

  • 如果您退出 eclipse 并有时返回,它会设法“忘记”您设置的配置。我发现删除包含路径(路径和符号)然后替换它(两次都使用“应用”)似乎说服它记住。
  • 感谢伊恩的详细回复。我为您提供了相关有用信息的支持,但这对我没有帮助。 ctype.h 定义 isdigit 并且是已解析的包含,但 isdigit 仍未定义。我也尝试了各种技巧(包括您提到的删除、应用、添加、应用),但均无济于事。
【解决方案2】:

我通过我在问题中建议的方法解决了这个问题,但还没有找到更好的方法。

【讨论】:

    【解决方案3】:

    也许这会有所帮助:

    1. 转到项目 > 属性
    2. 导航到 C/C++ 构建 > 设置
    3. 转到 GCC C 链接器 > 其他设置
    4. 在链接器标志中添加以下内容:-lc

    【讨论】:

    • 天一,感谢您的回复。不幸的是,这对我的问题没有帮助。我认为我的问题是由 CDT 代码分析引起的 - 链接器设置会影响 CDT 代码分析吗?无论如何,谢谢!
    • "链接器设置会影响 CDT 代码分析吗?"抱歉,我不太了解他们的关系...
    【解决方案4】:

    您是否尝试过重建索引器? (右键单击项目资源管理器索引中的项目->重建) 有时这会解决问题...如果您从早期版本的 eclipse 升级,您的索引器设置可能会出现问题 - 您可能想尝试恢复索引器默认值(首选项 c/c++ 索引器)...希望这会有所帮助 -这个问题可能会“令人抓狂”(似乎经常发生)

    【讨论】:

    • 感谢您的建议 - 不幸的是,我之前确实尝试过重建索引。我还对索引器首选项进行了几处更改(没有任何帮助),然后重置为默认值(仍然没有乐趣)。
    【解决方案5】:

    我在使用不同工具链的 Linux 上遇到了同样的问题。即使是最简单的 C++ 代码(如由 hello 向导创建的代码)也会有语法错误,而不会出现构建问题。正如 Thorbjorn Jemander 在另一篇文章中指出的那样,问题出在索引器中,可以通过取消选择“允许包含的启发式结果”选项来消除它。明确:Winsow -> Preferences -> C/C++ -> Indexer -> 取消选择上述选项。

    之后,您可能会看到在编辑器中打开文件并在编辑器页面内单击后突出显示的错误消失...

    【讨论】:

    • 马塞洛,感谢您的回复。不幸的是,这对我遇到的 isdigit 问题没有帮助。
    猜你喜欢
    • 2012-03-04
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 2015-11-07
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多