C++ 如何从头声明中找到源代码?

C++ 如何从头声明中找到源代码?,c++,c,linux,emacs,C++,C,Linux,Emacs,我想在/usr/include/中浏览头文件中符号的源代码。例如,在netdb.h中,有一个名为getaddrinfo(…)的函数。我想知道源代码存储在哪里,至少通过使用shell 如果您能告诉我如何在Emacs和/或Cscope中具体执行此操作,我将不胜感激。您可以使用 C-]-转到定义 C-T-从定义跳回。 C-W C-]如果您计划在Emacs中使用cscope,请以水平拆分方式打开定义查看以下文本(来自xscope.el) * Keybindings: All keybindings u

我想在/usr/include/中浏览头文件中符号的源代码。例如,在
netdb.h
中,有一个名为
getaddrinfo(…)
的函数。我想知道源代码存储在哪里,至少通过使用shell

如果您能告诉我如何在Emacs和/或Cscope中具体执行此操作,我将不胜感激。

您可以使用

C-]
-转到定义
C-T
-从定义跳回。

C-W C-]
如果您计划在Emacs中使用cscope,请以水平拆分方式打开定义

查看以下文本(来自xscope.el)

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

标准C库函数的定义(带有函数体)在。几个函数(如手册第2节中的函数,系统调用号列在
中),因此实际工作是在源代码处于打开状态的内部完成的。例如,是一个系统调用(主要在内核中完成),库函数(其代码在GNU Libc中)可以使用它。您可以安装GNU Libc源代码并使用
ctags
在那里查找符号


标准C库函数的声明位于
/usr/include
下的头文件中,因此像ctags这样的实用程序可以帮助您找到它们。

如前所述,您可以使用etags为指定的 来源

i、 e

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

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

然后你可以用M-,当它要求的时候 对于标记文件,请使用
包含\u标记
。首先需要花费一些时间
时间过得真快

但是,您只需跳转到标题中的定义,而不是 源代码,如果你想这样做,你必须下载源代码和
生成它的标签。

奇怪的是,没有其他人提到它,但是……为了查看 源代码,您必须拥有它 资源是专有的;要访问它们,您需要一个特殊的 许可证,或为公司工作。对于Linux,源代码为 公开可用,但通常不会安装在计算机上。如果 这是你的机器,你有用来安装系统的DVD 资料来源应该在上面,通常在一个单独的包里。如果你没有 有安装DVD,否则无法在系统上安装软件包 (对于大多数专业使用Linux的人来说),您必须
从internet的某个地方下载它们。

更多的最新方法是遵循中的方法,其中包含多个方法来跳转源代码树,并处理具有数万个文件的大型项目。

如果您使用的是emacs和etags,则可以创建包含头声明的标记文件

$>etags-e-L{file_list}--c-kind=+px

p表示原型,x表示外部变量

然后您可以在标题中看到函数的定义和原型定义,以点击M-


最近的emacs有xref功能,因此xref find definition将在标题中显示定义和原型的2行。

我想浏览定义,但不是在同一目录中,而是在其他地方。就像/usr/include/netdb.h中的情况一样,源代码应该在其他地方。我尝试了你的方法,但它似乎无法找到source、 如何添加搜索路径?如果您想查看
getaddrinfo
的源代码,您需要查看GNU Libc的源代码。更多信息,请参阅我的答案。我在为Als编写的注释中遇到了相同的问题。您能举一个如何浏览getaddrinfo(…)的示例吗在netdb.h中使用etags或cscope。我在Linux内核源代码上尝试了它,但似乎找不到它的名称。
getaddrinfo
不是一个系统调用。它在GNU Libc中实现,并使用系统服务(如DNS…)请接受任何适合您需要的答案…(您的问题以不同的方式理解)。谢谢。我的机器上有源代码。但正如Basile Starynkevitch所说,我在错误的地方搜索了定义。那么,glibc的实际源代码存储在哪里呢?在/src中,只有linux内核的源代码。我的OpenSUSE通过包管理器安装了glibc源代码,我从www.kern下载了linux源代码org.@Amumu我不确定(而且我目前没有安装源代码的Linux机器进行检查)。我认为,如果源代码是通过包加载器安装的,作为源代码包,那么它们将位于
/src
下;如果不是,您应该能够在gnu归档中找到它们,下载它们,并将它们放在您想要的任何地方。(例如,Gzip已经为许多版本提供了源代码。)谢谢。我投票给了所有人,因为每个答案对我都很有用。我会在获得源代码后尽快尝试你的答案。那么,glibc的实际源代码存储在哪里呢?在/src中,只有linux内核的源代码。我给了你一个链接f