GCC 编译选项语法

Posted

技术标签:

【中文标题】GCC 编译选项语法【英文标题】:GCC Compiling options syntax 【发布时间】:2011-11-18 06:15:53 【问题描述】:

我正在尝试 gprof 我的程序。我想要逐行分析。 但是,我似乎无法正确使用语法。我使用的是“make”而不是“gcc”,所以请只提供适合 make 的建议。如果您能给我完整的“make”语法,我将不胜感激。 基于本网站: http://sourceware.org/binutils/docs/gprof/Output-Options.html[^] http://sourceware.org/binutils/docs/gprof/Line_002dby_002dline.html[^] 这是我输入的内容:

make USE_LOCAL_HEADERS=0 LDFLAGS='-L.' BASE_CFLAGS=-m32 CFLAGS='-fopenmp -pg -l -g'

输出是:

/usr/bin/ld: cannot find -l-g
collect2: ld returned 1 exit status
make[2]: *** [build/release-linux-ppc64/ioquake3.ppc64] Error 1
make[2]: Leaving directory `/r/home7/yasir/minoru/cfe2/yasirTemp/ioquake3dev/svfb_201110271440/ioquake3dev_clean'
make[1]: *** [targets] Error 2
make[1]: Leaving directory `/r/home7/yasir/minoru/cfe2/yasirTemp/ioquake3dev/svfb_201110271440/ioquake3dev_clean'
make: *** [release] Error 2

我需要选项“-l”、“-g”和“-pg”。

【问题讨论】:

您认为-l 标志应该做什么?它通常意味着包含一个共享库,您可以在其后指定其名称。相反,您有-g 来启用调试。 gprof 不会逐行提供信息。它告诉程序计数器样本在每个函数中出现了多少次,并计算 A 调用 B 的次数。从中尝试做出有用的总结。它对系统调用(如 I/O)所花费的任何时间视而不见。 Here's how it works. 【参考方案1】:

-pg 启用分析,-g 包括有助于解释生成的分析的符号名称。

-pg 选项需要传递给编译器链接器。

-l 命令在您使用它的方式上没有意义,因为它需要一个库名称作为参数,所以只要您不提供,就不要使用 -l

在开发过程中,我建议使用-Wall 选项来启用编译过程中的所有警告。

所以你可以试试这个 make 命令:

make USE_LOCAL_HEADERS=0 LDFLAGS='-L. -pg' BASE_CFLAGS=-m32 CFLAGS='-fopenmp -pg -g -Wall'

【讨论】:

谢谢你们这些有用的答案!但是,我想使用 gprof 来查看在我的程序中哪些行执行得最多。这就是我想使用“-l”选项的原因。我发现了另一个叫做 gcov 的东西,但我不知道如何使用它,因为它必须执行每个 *.c 文件!!!有人对如何实现我的需要有任何想法吗? -l 选项是导致错误的原因。删除它,gprof 就可以工作了。要使用 gcov,请添加 -ftest-coverage -fprofile-arcs。对于 gprof 和 gcov,您需要重新编译整个项目。【参考方案2】:

您可以将其中大部分作为环境变量传递,让“应该”做正确的事情并将它们用于编译器:

$ USE_LOCAL_HEADERS=0 \
LDFLAGS='-L.' \
BASE_CFLAGS=-m32 \
CFLAGS='-fopenmp -pg -g' \
make

这将 USE_LOCAL_HEADERS、LDFLAGS、BASE_CFLAGS 和 CFLAGS 作为 make 和 gcc 可以看到的环境变量。您可能需要编辑您的 Makefile 以按照您想要的正确方式组合它们。

【讨论】:

这没有任何用处,而且可能会使事情变得更糟 - 命令行变量会覆盖在 makefile 中定义的变量,这反过来会覆盖环境(除非您使用 -e,但您没有使用)。 @ams 你是什么意思?这一直是 GNU make 的工作方式,gnu.org/s/hello/manual/make/Environment.html【参考方案3】:

make 只是一个“自动确定需要重新编译大型程序的哪些部分,并发出重新编译它们的命令”(man make)。看起来make 无法理解您的论点;在遇到错误之前它实际上并没有运行任何命令。

很抱歉,我无法为您提供更多帮助,但您的问题出在您的 make 文件或类似文件中。您应该阅读 make 文件是什么,以及如何 gprof 您的程序并了解 make 和 gcc 之间的区别,并重新评估您正在尝试做什么。 Make 可能对你没用。

【讨论】:

-1:Make 显然已经运行了编译器,因为ld 给出了错误。

以上是关于GCC 编译选项语法的主要内容,如果未能解决你的问题,请参考以下文章

gcc编译选项总结

gcc编译选项总结

Nginx编译安装以及选项

学习记录:gcc/g++ 编译与链接

gcc 编译控制选项

GCC选项