小编lui*_*dim的帖子

如何在链接时重新定位__gcov_init未定义的引用问题

我现在正在进行C代码覆盖率研究并遇到以下问题,GCC版本4.4.6:

  1. 添加了编译器标志CFLAGS = --coverage和链接器选项LDFLAGS := --coverageLOCAL_LDLIBS := --coverage得到错误:

undefined reference to '__gcov_init'" and "undefined reference to '__gcov_merge_add'

  1. 添加选项LOCAL_LDFLAGS := --coverage,并收到链接错误:

libgcov.a(_gcov.o): in function __gcov_set_sampling_rate: undefined reference to '__gcov_sampling_rate' libgcov.a(_gcov.o): in function gcov_exit: undefined reference to '__gcov_pmu_profile_filename' libgcov.a(_gcov.o): in function __gcov_init: undefined reference to '__gcov_pmu_profile_options' '__gcov_pmu_top_n_address'

有人可以帮忙就这个问题提供一些建议吗?

linker gcov undefined-reference

38
推荐指数
3
解决办法
3万
查看次数

是什么导致在取消try-block期间抛出析构函数的奇怪行为?

当try块遇到异常时,将取消堆栈堆栈。如果在try块内部创建了对象,则调用析构函数。如果析构函数引发另一个异常,则不会捕获此异常,并且程序将终止。

因此,如果您有:

struct A {
    ~A () noexcept(false) {
        std::cout << "A::~A" << std::endl;
        throw std::runtime_error("A::~A ERROR");
    }
};
Run Code Online (Sandbox Code Playgroud)

然后您的try-catch块类似于:

try {
    A a1;
    A a2;
} catch (...) {}
Run Code Online (Sandbox Code Playgroud)

然后,当try块完成时,a2抛出异常的析构函数,捕获异常,然后抛出异常的析构函数a1并终止程序。一切正常。

但是,如果您引入另一个结构,该结构也抛出了析构函数,但从成员继承A或具有A成员实例,事情就会变得混乱。例如,如果您有:

struct B : A {
    ~B () noexcept(false) {
        std::cout << "B::~B" << std::endl;
        throw std::runtime_error("B::~B ERROR");
    }
};
Run Code Online (Sandbox Code Playgroud)

然后,如果您这样做:

try {
    B b;
    A a;
} catch (...) {}
Run Code Online (Sandbox Code Playgroud)

预期的结果应该A::~A是称为异常捕获,然后B::~B称为程序终止。但是,相反,在我尝试过的所有编译器中,除MSVC之外,输出为:

A::~A

B::~B

A::~A
Run Code Online (Sandbox Code Playgroud)

抛出的实例后终止调用 std::runtime_error …

c++ destructor exception try-catch language-lawyer

8
推荐指数
1
解决办法
139
查看次数