gcc gcov不生成gcda文件

fkaflof6  于 2022-12-19  发布在  其他
关注(0)|答案(5)|浏览(889)

我试着用-fprofile-arcs-ftest-coverage运行gcov,但没有任何链接。
它给出了以下错误:-

hidden symbol `__gcov_init' in /home/mojave/tools/gcc-4.4.1/amd64/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.4.1/libgcov.a(_gcov.o) is referenced by DSO

并且程序退出。
编译命令-

bsub -g /mojave/build/"DummyDate" -J compile-obj/linux24rhel3_x86_64_GCOV64/DXp.o -I -q DFM -S 8192 -R "(model==OPTERON_250)" '/usr/bin/time --format="          ...finished DXp [`hostname`] [%E s with %P CPU]"  /home/mojave/tools/gcc-4.4.1/amd64/bin/g++ -fPIC -Wall -Wno-deprecated -DTCL_8_5 -m64 -march=opteron -DLITTLE_ENDIAN_PLATFORM -DARCH=amd64 -DARCH_amd64 -DARCH_BITS=64 -DARCH_BITS_64 -fsigned-char -msse3 -D__DISABLE_MULTITHREAD__ -D_CPP_NUMERIC_LIMITS -mfpmath=sse,387 -mmmx -m3dnow -pipe -Dgcc -DLICENSE_ALWAYS_GOOD -I/home/mojave/tools/flexlm/include/v8.4 -DNO_SUPPORT_STABIE -DGCOV -I../dxpclient -I/home/mojave/tools/bzip2-1.0.2/amd64/include -I/home/mojave/tools/zlib-1.2.3/amd64/include -I/home/mojave/tools/tcltk8.5.2/amd64//include -I/home/mojave/tools/tcltk8.5.2/amd64//include -g -fprofile-arcs -ftest-coverage -DBUILD_DATE=\""UNSET"\" -DVERSION_NUMBER=\"Dum.Dum.Dum.Dummy\" -DEXT_VERSION_NUMBER=\"Dum.Dum.Dum.Dummy\" -DLAST_RELEASE_VERSION=\"1.1614\" -Wreturn-type -DTCL_8_5 -DGOOGLE_MALLOC -L../dx/linux24rhel3_x86_64_GCOV64/ -ldx -o obj/linux24rhel3_x86_64_GCOV64/DXp obj/linux24rhel3_x86_64_GCOV64/DXp.o -Wl -lgcov /home/mojave/tools/zlib-1.2.3/amd64/lib/libz.a  -L/home/mojave/tools/bzip2-1.0.2/amd64/lib -lbz2    -ldl'

任何帮助都将感谢投票。
谢谢。

2g32fytz

2g32fytz1#

-fprofile-arcs-ftest-coverage编译,在生成共享对象的时候用-lgcov链接,就可以了。
您也可以使用--coverage选项作为所有三个步骤的同义词
查看:gcc工具选项了解更多信息

iyzzxitl

iyzzxitl2#

我刚刚发现,如果我发送一个签名杀死或签名条款到我的程序,只有GCNO文件,没有GCDA文件。

zysjyyx4

zysjyyx43#

在考虑编译标志之后,如上面crazy_prog所提到的,检查“路径”。当使用lcov/gcov进行覆盖时,路径起着重要的作用。
因此,创建二进制文件的路径(完整路径字符串)和运行二进制文件的路径应该完全相同。
就我的目的而言,由于二进制文件的创建和执行是在不同的地方(一个在开发环境中,另一个在实际板上),所以使用软链接/快捷方式,我创建了类似的路径,并因此运行可执行文件。最后,可以在开发环境中生成报告(通常,因为实际板上的平台可能没有lcov工具支持)。

thtygnil

thtygnil4#

除了上面的编译选项和链接选项之外,我的输入是,如果您以非宽限方式(如ctrl-c)终止程序,程序将不会干净地退出,也不会生成gcda文件。
因此,解决这个问题,以便gcda文件将生成,即使你使用ctrl-c,如下所示:

void handler(int signum)
{
     /* SIGTERM dnd clean up (close file descriptors, etc).  */
 
     exit(0);
}
 
int main(int argc, char *argv[])
{
    signal(SIGTERM, handler);
    signal(SIGHUP, handler);
    signal(SIGINT, handler);
    ....
}
smtd7mpg

smtd7mpg5#

我将添加一些我发现阻止我看到gcda文件创建的东西,因为这个问题或相关问题的其他答案都没有帮助我。
在我的例子中,我有一个文件,其中包含一个未关闭的杂注包,例如:

#pragma pack(1)

typedef struct thing_t
{
    int x;
    int y;
} thing_t;

int functionA();

<END OF FILE>

当我这样更正时:

#pragma pack(1)

typedef struct thing_t
{
    int x;
    int y;
} thing_t;

// go back to normal packing
#pragma pack()

int functionA();

<END OF FILE>

然后在运行我的测试之后生成gcda文件。

相关问题