今天,我发现了一个相当有趣的事情g++或者nm......构造函数定义似乎在库中有两个条目.
我有一个标题thing.hpp:
class Thing
{
Thing();
Thing(int x);
void foo();
};
Run Code Online (Sandbox Code Playgroud)
而且thing.cpp:
#include "thing.hpp"
Thing::Thing()
{ }
Thing::Thing(int x)
{ }
void Thing::foo()
{ }
Run Code Online (Sandbox Code Playgroud)
我编译它:
g++ thing.cpp -c -o libthing.a
Run Code Online (Sandbox Code Playgroud)
然后,我继续nm:
%> nm -gC libthing.a
0000000000000030 T Thing::foo()
0000000000000022 T Thing::Thing(int)
000000000000000a T Thing::Thing()
0000000000000014 T Thing::Thing(int)
0000000000000000 T Thing::Thing()
U __gxx_personality_v0
Run Code Online (Sandbox Code Playgroud)
如您所见,两个构造函数Thing都在生成的静态库中列出了两个条目.我的g++是4.4.3,但是同样的行为发生在clang,所以这不仅仅是一个gcc问题.
这不会引起任何明显的问题,但我想知道:
编辑:对于卡尔,没有C参数的输出:
%> …Run Code Online (Sandbox Code Playgroud) 开发环境:GNU GCC(g ++)4.1.2
虽然我正在尝试研究如何在单元测试中增加"代码覆盖率 - 特别是功能覆盖率",但我发现有些类dtor似乎是多次生成的.你们当中有些人知道为什么吗?
我通过使用以下代码尝试并观察了我上面提到的内容.
在"test.h"中
class BaseClass
{
public:
~BaseClass();
void someMethod();
};
class DerivedClass : public BaseClass
{
public:
virtual ~DerivedClass();
virtual void someMethod();
};
Run Code Online (Sandbox Code Playgroud)
在"test.cpp"中
#include <iostream>
#include "test.h"
BaseClass::~BaseClass()
{
std::cout << "BaseClass dtor invoked" << std::endl;
}
void BaseClass::someMethod()
{
std::cout << "Base class method" << std::endl;
}
DerivedClass::~DerivedClass()
{
std::cout << "DerivedClass dtor invoked" << std::endl;
}
void DerivedClass::someMethod()
{
std::cout << "Derived class method" << std::endl;
}
int main()
{
BaseClass* …Run Code Online (Sandbox Code Playgroud) 我在我的项目中使用CMake并设置了一个用于连续/夜间构建的cdash服务器.一切运作良好,通过设置crontab,我们将每小时/每晚的构建/测试结果自动上传到我们的cdash服务器.
我的下一步是将测试覆盖率报告添加到构建中.我在http://www.cmake.org/Wiki/CTest:Coverage找到了这份文件,但坦率地说,它与实用指南相差甚远.
目前我已经添加了所需的标志(而不是-fprofile-arcs -ftest-coverage,我发现--coverage更好),编译过程生成.gcno文件.但后来我被卡住了.命令
make NightlyCoverage
Run Code Online (Sandbox Code Playgroud)
好像什么也没做.谁能告诉我接下来要做什么?我想要的结果是make NightlyCoverage,生成覆盖率报告并上传到cdash服务器.