在C ++中查找函数定义

时间:2014-04-25 07:45:42

标签: c++ makefile

我在远程机器上有一个用makefile编译的C ++项目。没有ide,只有vim和命令行。我在源代码中找到了一个函数,想要找到它的定义。如果不手动查看所有-I目录和源文件,我怎么能这样做? 是否可以在生成的源文件中预处理阶段和查找后停止makefile?

4 个答案:

答案 0 :(得分:4)

您可以使用ctag和cscop浏览vi上的代码。 如果您对此不满意,请使用

grep -rn funtion_name ./

在源代码的主目录中,并手动在结果集中查找定义。

答案 1 :(得分:1)

我目前正在Visual Studios开发,但我仍在使用 vim作为我的编辑器,Unix使用套件(来自CygWin) 关于编译和调试的一切。

首先,当然,如果你不能轻易推断出功能的位置 声明和定义,你的来源有问题 结构和命名约定。遗憾的是,我们大多数人都没有 完全控制,案件确实发生。

如果该功能在您的源树中,您可以使用搜索 grep,可能find找到要搜索的文件。如果 它不是(通常是这种情况),你通常可以输出 通过使用-E调用编译器来获得预处理器结果 选项。您可能希望在make中为此定义目标。 另一方面,您需要的编译器选项 -I-D选项;如果它们不是太复杂,你可以 只需手动调用编译器。 (或者你可能会考虑 使用它们定义环境变量,这样您就可以轻松完成 手动调用编译器。)-E通常会输出到 标准输出,因此您必须将输出重定向到文件。 之后,很容易找到函数所在的文件 声明,因为预处理器输出包含#line 带有文件名的指令。至于定义的位置......如果 它的第三方软件,你甚至可能没有这个定义; 供应商通常只提供标题和库。

答案 2 :(得分:1)

最简单的解决方案是使用grep(使用find来快速获得结果),如下所示:

find srcDir -name "*.c" -o -name "*.cpp" -print0 | xargs -0 grep "functionName"

基于Makefile的解决方案是更改链接,因此您要求这样的函数定义的详细位置(如果您使用GCC)(您也可以在命令行中使用" make LDFLAGS =。 ..seebelow ...&#34)

# In your makefile, locate this:
LDFLAGS:= ...
# Replace by this
LDFLAGS:= -Wl,--trace-symbol=functionName

这导致:

$ gcc -o test main.o -Wl,--trace-symbol=main
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crt1.o: reference to main
main.o: definition of main

如果您有足够的类似函数名称,并且您实际上想要在最终二进制文件中使用的那个,那么此解决方案很有用。

答案 3 :(得分:1)

你可以使用几个插件来进行代码浏览。

我的一个朋友创建了自己的插件:lh-tags他开发了一个用于Cim和C ++基本代码的vim的索引器,其中包含clang:CLIC(带有自己的帮助程序包,vim-clang