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 编译选项语法的主要内容,如果未能解决你的问题,请参考以下文章