2010-03-01 76 views
5

它只是为了测试编译一个简单的程序,并在其中包含头文件#include?以编程方式检查头文件是否存在的最佳方法?

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

+0

您有文件名和包含目录列表。为什么不检查文件是否在其中? – 2010-03-01 02:59:09

+1

@Nikolai:不仅仅是这样做的一个原因是,'标题'标题本身可能包含其他文件,并且很难通过检查它们是否全部存在来检查它所依赖的文件是否存在尝试编译。 – 2010-03-01 03:36:48

+0

@Jonathan:我明白这一点。当然,这完全取决于项目的范围,但我会对'include'指令进行递归搜索。 – 2010-03-01 03:47:41

回答

6

是的,使用编译器编译你的简单测试程序。这是查看编译器是否可以找到头的最好也是最简单的方法。如果你硬编码#include搜索路径,你将不得不修改并适应不同的编译器。

+0

同意;正如Jonathan Leffler所指出的那样,这就是Autoconf所做的,至少是一个有利的经验投票。 – 2010-03-01 05:12:35

4

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

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

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

-1

使用以下程序,您可以找到头文件的存在。

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

} 
+1

评论?为您正在搜索的文件固定名称。修复您要查找的文件的位置。在编译用于查找的程序时使用您正在查找的文件。在标准输出上打印状态,如果没有,则在标准错误条件下打印。不成功和失败返回不同的退出状态。使用main-C99的古老C定义需要'int main()'或'int main(void)',所以这必须是C89或更旧的代码。不幸的是,当你没有显式返回时,只有C99保证main()返回的零退出状态,所以退出状态是未定义的。 – 2010-03-02 15:12:47

+0

这根本不起作用。 – 2015-12-10 13:23:18

相关问题