2011-12-02 59 views
3

我想浏览/ usr/include /中头文件中符号的源代码。例如,在netdb.h中,有一个名为getaddrinfo(...)的函数。我想知道至少通过使用shell来存储源代码的位置。如何从头声明中找到源代码?

如果你告诉我如何在Emacs和/或Cscope中专门做到这一点,我将更加感激。

+0

请接受任何符合您需求的答案......(您的问题已通过不同方式了解)。 –

回答

0

更新的方法是遵循this guide中的方法,该方法包含几种跳转源代码树的方法,并且可以处理有几万个文件的大型项目。

2

您可以使用c-tags

C-] - 定义
C-T - 从定义跳回。
C-W C-] - 在一个水平分割

+0

那么我想浏览定义,但不是在同一个目录中,但其他地方。就像/usr/include/netdb.h中的情况一样,源代码应该在别处。我尝试了你的方法,但它似乎无法找到源代码。我如何添加搜索路径? – Amumu

+0

如果你想看看'getaddrinfo'的来源,你需要有GNU Libc的源代码。看到我的答案更多。 –

2

看一看下面的文字(它来自xcscope.el)如果您计划在Emacs中使用cscope的打开的定义。

* Keybindings: 

All keybindings use the "C-c s" prefix, but are usable only while 
editing a source file, or in the cscope results buffer: 

    C-c s s   Find symbol. 
    C-c s d   Find global definition. 
    C-c s g   Find global definition (alternate binding). 
    C-c s G   Find global definition without prompting. 
    C-c s c   Find functions calling a function. 
    C-c s C   Find called functions (list functions called from a function). 
    C-c s t   Find text string. 
    C-c s e   Find egrep pattern. 
    C-c s f   Find a file. 
    C-c s i   Find files #including a file. 

您可以在该文件中找到更多的信息。通过下面的链接也可能会有所帮助:

之前查找使用Cscope的一个符号,你首先应该通过C-c s I在你的代码库的根目录下创建一个索引,例如,一个文件夹称为foo。然后将生成两个文件。 Cscope将递归地查找包含在foo中的所有源文件,并创建一个名为cscope.files的列表。然后它将使用此列表为每个文件中的所有符号创建一个索引,并将此信息存储在文件cscope.out中。之后,只需按下C-c s a将cscope的初始目录设置为foo,告诉Cscope在哪里可以找到cscope.out。然后上面提到的键绑定应该工作。

+0

我在为Als写的评论中描述了同样的问题。 – Amumu

+0

您可以举一个例子,了解如何使用etags或cscope在netdb.h中浏览getaddrinfo(...)。我在Linux内核源码上试过了,似乎无法找到它的名字。 – Amumu

+0

'getaddrinfo'不是系统调用。它在GNU Libc中实现并使用系统服务(如DNS ...) –

3

标准C库函数的定义(带函数体)在GNU Libc内部(通常在Linux上)。几个函数(syscalls手册页的第2部分中的系统调用编号在<asm/unistd.h>中列出)的几个函数是system calls的小包装,因此实际工作在linux kernel内完成,其源代码为kernel.org。例如,write(2)是一个系统调用(主要在内核中完成),可由printf(3)库函数(其代码位于GNU Libc中)使用。您可以安装GNU Libc源代码并使用ctags在那里找到符号。

的标准C库的函数声明在头文件/usr/include下,所以像的ctags工具可以帮助你找到他们。

+1

谢谢。我为每个人提供了优惠,因为每个答案都对我有用。我会尽快得到你的答案。 – Amumu

+0

那么,glibc的实际源代码在哪里呢?在/ src中,只有linux内核的来源。 – Amumu

+0

我给你一个Glibc的链接。在Debian和Ubuntu发行版(&其他)上,您还可以安装相关软件包的源代码。 http://ftp.gnu.org/gnu/glibc/ –

1

如前所述,您可以使用etags为指定的 源生成标记。

find /usr/include/ -type f -name \*.h -exec etags --append -o INCLUDE_TAGS {\} \;

这将创建一个名为INCLUDE_TAGS文件,其中包含在位于 /usr/include/头每一个定义的 位置。

然后你可以使用M - ,并且当它询问 TAGS文件使用INCLUDE_TAGS。第一次需要一些时间,但速度很快。

但是你只跳到定义在头不在 源,如果你想这样做,你必须下载的来源和 产生的标签。

1

很奇怪,没有人提到它,但...为了查看 源代码,你必须拥有它。在大多数Unices(除了Linux之外)中,这样的源是专有的;要访问他们,您需要一个特殊的许可证,或为公司工作。在Linux的情况下,来源是公开可用的来源 ,但通常不会安装在机器上。如果 它是您的机器,并且您有用于安装系统的DVD,则应该在其上安装源代码,通常位于单独的软件包中。如果您没有 有安装DVD,或者您不能在系统 (大多数人专业使用Linux的情况下)上安装软件包,则必须从 将它们从互联网上下载到某处。

+0

谢谢。我的机器上有源代码。但是,正如Basile Starynkevitch所说,我在错误的地方搜索了定义。 – Amumu

+0

那么,glibc的实际源代码在哪里存储呢?在/ src中,只有linux内核的来源。我的OpenSUSE通过软件包管理器安装了glibc源代码,并从www.kernel.org下载了Linux源代码。 – Amumu

+0

@Amumu我不确定(而且我目前没有安装源代码的Linux机器来检查)。我认为如果源代码是通过包装加载程序安装的,作为源代码包,那么它们将位于'/ src'下的某个位置;如果没有,你应该能够在gnu档案中找到它们,下载它们,并把它们放在你想要的地方。 (例如,http://ftp.gnu.org/glibc为许多版本提供gzip源代码。) –