不应该很难,对吗?正确?
我目前正在搜索OpenAFS代码库以查找pioctl的标头定义。我抛出了我所拥有的一切:检查了ctags,grepped pioctl的源代码,等等。我最接近领导的事实是有一个文件pioctl_nt.h包含定义,除了它的实际上并不是我想要的,因为没有任何用户空间代码直接包含它,而且它是Windows特定的。
现在,我不希望你去下载OpenAFS代码库并为我找到头文件。不过我很好奇:当其他一切都失败时,你找到所需头文件的技巧是什么?什么是最糟糕的情况可能会导致代码库中的pioctl的grep实际上没有出现任何看起来像函数定义的东西?
我还应该注意,我可以访问两个已经正确完成它的独立用户空间程序,所以理论上我可以对该函数进行O(n)搜索。但是没有一个头文件弹出给我,而且n很大......
编辑:即时问题已经解决:pioctl()是隐式定义的,如下所示:
AFS.xs:2796: error: implicit declaration of function ‘pioctl’
答案 0 :(得分:4)
如果grep -r
和ctags
失败,那么它可能被定义为一些令人讨厌的宏的结果。您可以尝试创建调用pioctl()
并编译成功的最简单文件,然后对其进行预处理以查看会发生什么:
gcc -E test.c -o test.i
grep pioctl -C10 test.i
答案 1 :(得分:2)
有一些编译器选项可以显示预处理器输出。试试那些?在一个可怕的捏点,我的头完全没有任何可能的定义-E选项(在大多数c编译器中)除了喷出预处理的代码之外什么都不做。
每个请求的信息:通常我只是捕获有问题的文件的编译,因为它在屏幕上输出做快速复制并粘贴并在编译器调用后立即放入-E。结果将预处理器输出喷射到屏幕,以便将其重定向到文件。查看该文件,因为已经处理了所有宏和愚蠢的事情。
最糟糕的情况:
答案 2 :(得分:1)
您是否考虑过使用cscope
(可从SourceForge获得)?
我在一些相当重要的代码集上使用它(25,000多个文件,文件中最多约20,000行)并取得了很好的成功。在古代的Sun E450上构建交叉引用需要一段时间才能获得文件列表(5-10分钟)和更长时间(20-30分钟),但我发现结果很有用。
在几乎同样古老的Mac(双1GHz PPC 32位处理器)上,在OpenAFS(1.5.59)源代码上运行的cscope会出现很多声明函数的地方,有时是代码内联,有时在标题中。扫描4949文件花了几分钟,生成一个58 MB的cscope.out文件。
发现的184个实例中的其余部分似乎是使用函数,文档引用,发行说明,更改日志等。
答案 3 :(得分:0)
我们决定在预处理器上找不到任何东西后,我们已经决定的当前工作原理是OpenAFS让编译器推断函数的原型,因为它返回一个整数并取指针,整数,指针,整数作为其参数。我将通过自己定义它来解决这个问题。
修改:非常好!我找到了吸烟枪:
AFS.xs:2796: error: implicit declaration of function ‘pioctl’
答案 4 :(得分:0)
虽然原始的一般问题已经得到解答,但是如果有人到达此页面,想知道在哪里找到定义pioctl的头文件:
在当前版本的OpenAFS(1.6.7)中,pioctl的原型在sys_prototypes.h中定义。但是,这个问题最初被问到的时间,该文件不存在,并且没有从OpenAFS代码树外部可见的pioctl原型。
然而,pioctl的大多数用户可能想要或者至少可以使用lpioctl(“local”pioctl),它总是在本地机器上发出系统调用。 afssyscalls.h中有一个原型(现在也是sys_prototypes.h)。
这些天最简单的选择就是使用libkopenafs。为此,包括kopenafs.h,使用函数k_pioctl,并链接-lkopenafs。与尝试与OpenAFS libsys和其他东西链接相比,这往往是一个更方便的界面。
答案 5 :(得分:-1)
它通常在手册页简介中说出来吗?