我如何获得gcc配置文件引导的优化以在“优化”后停止写入文件?

问题描述 投票:0回答:1

我正在makefile中执行此操作,它会在第一次运行时在该目录中创建.gcda文件;但是,只要我执行第二步,如果发现可执行文件的运行速度几乎一样慢(这肯定是相关的),在编译后仍将new文件写入dir。据我了解,这不应该发生。删除-fprofile-arcs(或与此有关的-lgcov)会使第二个编译器抱怨缺少符号。我想念什么?我在这两个执行之间都处于make clean

[除-lgcov外,我还尝试了一些变体,但我通过阅读手册达到了这一目的,并且意识到-fprofile-use打开了很多优化,包括-fprofile-arcs,但我尝试过的任何简单选择都没有。

PROFILE_DIR=/tmp/pgo/${PN}
ifeq ($(wildcard $(PROFILE_DIR)),)
all:
  CXXFLAGS += -O3 -march=native -fprofile-generate=${PROFILE_DIR} -fprofile-correction
  CFLAGS   += -O3 -march=native -fprofile-generate=${PROFILE_DIR} -fprofile-correction
  LDFLAGS  += -fprofile-arcs
  $(info profile-sampling build)
else
all:
  CXXFLAGS += -O3 -march=native -fprofile-use=${PROFILE_DIR} -fprofile-correction
  CFLAGS   += -O3 -march=native -fprofile-use=${PROFILE_DIR} -fprofile-correction
  LDFLAGS  += -fprofile-arcs
  $(info profile-guided build)
endif

gcc版本为gcc (Ubuntu 9.2.1-9ubuntu2) 9.2.1 20191008

编辑:带有文件的案件的最终LDFLAGS是:-lpthread -ldl -lrt -fPIC -shared -Wl,--no-undefined -Wl,--version-script=link.T -fprofile-arcs

[如果我没记错的话,-Wl,--no-undefined破坏了不链接gcov或不使用-fprofile-arcs的原因,因为gcov的符号即使在使用的文件中不再重要,并且该选项已显式地出现在文件中无法对所有缺少的符号进行编译。因此,解决方案可能会在第二次编译中省略-fprofile-arcs,并且(以某种方式)仅允许单个库gcov具有未初始化的符号。我不知道如何尝试第二个。

编辑2:不幸的是,不,它在运行时崩溃,没有该标志,也没有链接到-gcov(直接或间接)。因此,.gcda文件中的something强制-lgcov,这将强制生成的可执行文件开始写入.gcda文件,但是,如果您尝试删除-lgcov,则可能会生成失败或运行时崩溃。我不明白这应该如何工作,或者为什么这些文件不只是编译时的工件....

gcc optimization compilation gcov
1个回答
0
投票

这是由于'make clean'而不是删除所有创建的.o文件而是过时的部分硬编码列表引起的。第二个编译“重用”了第一个(插入的)编译中的某些.o文件,因此需要-lgcov LDFLAG,后者自然会启动第二个编译以再次进行概要分析。

© www.soinside.com 2019 - 2024. All rights reserved.