在C+中查找函数定义+; 我在远程机器上有一个C++项目,它用MaFag文件编译。没有可用的ide,只有vim和命令行。我在源代码中找到了一个函数,希望找到它的定义。我如何在不手动查看所有-I目录和源文件的情况下做到这一点? 在预处理阶段和查找结果源文件后,是否可以停止makefile?

在C+中查找函数定义+; 我在远程机器上有一个C++项目,它用MaFag文件编译。没有可用的ide,只有vim和命令行。我在源代码中找到了一个函数,希望找到它的定义。我如何在不手动查看所有-I目录和源文件的情况下做到这一点? 在预处理阶段和查找结果源文件后,是否可以停止makefile?,c++,makefile,C++,Makefile,您可以使用ctag和cscop浏览vi上的代码。 如果您对此不满意,请使用 grep -rn funtion_name ./ 在源代码的home目录中,手动查找结果集中的定义。我目前正在Visual Studio下开发,但我仍然使用 vim作为我的编辑器,Unix只花了几分钟就获得了工具包(来自CygWin) 除了编译和调试之外,什么都有 首先,当然,如果你不能很容易地推断出函数的位置 声明和定义,源代码有问题 结构和命名约定。遗憾的是,我们大多数人没有 完全控制,案件就真的发生了 如果函数位

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

grep -rn funtion_name ./

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

我目前正在Visual Studio下开发,但我仍然使用 vim作为我的编辑器,Unix只花了几分钟就获得了工具包(来自CygWin) 除了编译和调试之外,什么都有

首先,当然,如果你不能很容易地推断出函数的位置 声明和定义,源代码有问题 结构和命名约定。遗憾的是,我们大多数人没有 完全控制,案件就真的发生了

如果函数位于源代码树中,则可以使用
grep
,可能使用
find
查找要搜索的文件。如果 事实并非如此(通常情况下),您通常可以输出 使用
-E
选项您可能需要在
make
中为此定义一个目标。 另一方面,这里需要的编译器选项只有
-I
-D
选项;如果它们不太复杂,你可以 只需手动调用编译器即可。(或者你可以考虑 使用它们定义环境变量,以便 手动调用编译器。)
-E
通常会输出到 标准输出,因此必须将输出重定向到文件。 之后,很容易找到函数所在的文件 声明,因为预处理器输出包含#行 具有文件名的指令。关于它的定义。。。如果 它是第三方软件,你甚至可能没有定义;
供应商通常只提供标题和库。

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

find srcDir -name "*.c" -o -name "*.cpp" -print0 | xargs -0 grep "functionName"
基于Makefile的解决方案是更改链接,这样您就可以像这样请求函数定义的详细位置(如果您使用GCC)(您也可以在命令行上使用“make LDFLAGS=…请参见下文…”这样做)

这导致:

$ 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

如果您有很多类似的函数名,并且您实际上想要在最终二进制文件中使用的函数名,则此解决方案非常有用。

您可以使用几个vin插件来进行代码浏览


我的一个朋友创建了自己的插件:他开发了一个C++和C++基础代码的VIM索引器,用CLAN:(用它自己的助手包)

<代码> CTAGS < /Cord>是很好的。例如,我运行了<代码> CTAGS -R -C++类-++P-字段= +IAS——Ext+= +Q/Ur/Engult<代码>,以查找我整个C++项目和标准库的所有函数定义。超级有用的查找为什么一些std库函数在另一个系统上丢失。
$ 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