【问题标题】:Best way to programatically check for existence of header file?以编程方式检查头文件是否存在的最佳方法?
【发布时间】:2011-01-22 03:43:54
【问题描述】:

是否只是为了测试编译一个简单的程序,并在其中包含那个头文件?

为了更好地理解编译过程,我正在编写自己的“配置”,它会测试一些头文件和库文件是否存在。

【问题讨论】:

  • 你有文件名和包含目录的列表。为什么不检查文件是否在其中?
  • @Nikolai:不这样做的一个原因是“标题”标题本身可能包含其他文件,并且很难通过检查它们是否存在来检查它所依赖的那些文件是否存在全部存在而不是尝试编译。
  • @Jonathan:我明白这一点。当然,这完全取决于项目的范围,但我会递归搜索 include 指令。
  • @Nikolai:当心受保护的包含 - 有时标头有一个在本地平台上永远不会激活的 #include 行。确定是否包含该标头需要 C 预处理器。是的,可以做到;让 C 预处理器来做这件事可能更容易。
  • @Nikolai:最大的问题是你并不总是知道编译器会在哪里寻找文件,尤其是系统或第三方库。特别是在 Unix 上,安装多个编译器或同一编译器的不同版本并不罕见。或者将库安装在非标准位置。

标签: c++ c configure


【解决方案1】:

是的,使用编译器编译您的简单测试程序。这是查看编译器是否可以找到标头的最好和最简单的方法。如果您对#include 搜索路径进行硬编码,您将始终需要修改和适应不同的编译器。

【讨论】:

  • 同意;正如 Jonathan Leffler 指出的那样,Autoconf 就是这样做的,这至少是相当强烈的经验投票支持它。
【解决方案2】:

GNU Autoconf 套件通过运行测试编译来检查标头。仅测试文件 'filename.h' 的存在是相当简单的:

#include <filename.h>
int main(void){return 0;}

您可能更喜欢引号而不是尖括号。

【讨论】:

    【解决方案3】:

    使用下面的程序,可以发现头文件的存在。

    #include<stdio.h>
    main()
    {
            FILE * file;
            if ((file = fopen("/usr/include/stdio.h", "r"))!=NULL)
            {
                    fclose(file);
                    printf("true");
            }
            perror("err");
    
    }
    

    【讨论】:

    • 批评?您正在搜索的文件的固定名称。您要查找的文件的固定位置。在编译用于查找它的程序时使用您正在查找的文件。正常时在 stdout 上打印状态,否则在 stderr 上打印状态。不为成功和失败返回不同的退出状态。使用 main 的古老 C 定义 - C99 需要 'int main()' 或 'int main(void)',所以这必须是 C89 或更旧的代码。不幸的是,当您没有显式返回时,只有 C99 保证 main() 的退出状态为零,因此退出状态是未定义的。
    猜你喜欢
    • 2010-09-18
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多