我正在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,则可能会生成失败或运行时崩溃。我不明白这应该如何工作,或者为什么这些文件不只是编译时的工件....
这是由于'make clean'而不是删除所有创建的.o文件而是过时的部分硬编码列表引起的。第二个编译“重用”了第一个(插入的)编译中的某些.o文件,因此需要-lgcov LDFLAG,后者自然会启动第二个编译以再次进行概要分析。