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