如何使链接器更喜欢从给定位置实现

时间:2011-07-20 10:00:43

标签: c++ linker symbian arm

我需要一种让链接器更喜欢一种实现而不是另一种实现的方法。我的用例如下:我正在编写单元测试,我需要模拟一些对象。问题是那些对象在'main'库中,即使在调试中也无法丢弃,因为许多SDK都存在于那里。

所以我已经实现了那些模拟,但现在看来链接器更喜欢'main'库的实现,至少我的代码没有被调用。我正在使用带有Symbian工具链的ARM RVCT 4 C ++编译器,如果这很重要的话。

非常感谢任何想法(甚至解决方法)!

编辑:我需要模拟静态方法调用,可能它很重要,因为我认为静态方法与普通方法相比在其他方面有所联系。

2 个答案:

答案 0 :(得分:1)

通常在链接阶段不进行模拟,但在代码中解决。 Dependency Injection是首选技术之一。也就是说,您应该对代码进行建模,以便在真实和模拟实现之间进行选择。

例如,您想在代码中创建对象A.一种方法是在构建测试时有两个不同的A实现并链接到模拟实现。依赖注入方法建议具有指向接口的指针并从外部(例如,在构造函数中)传递对象本身。然后,从生产代码中,您将传递真实对象,并从单元测试中传递模拟。

如果您绝对需要在链接级别执行此操作并且无法避免链接“真实”对象,那么您可以包装这些对象吗?这是一个例子:

假设这是您要测试的代码:

void my_method()
{
    ProblematicClass c;
    c.Call();
}

ProblematicClass在两个地方实现:一个在SDK内,另一个是你的模拟。如果您可以将ProblematicClass包装在另一个类中,那么您可以创建两个源文件:

生产文件:

struct Wrapper
{
public:
    void Call() { m.Call(); }

private:
    ProblematicClass m;
}

模拟文件:

struct Wrapper
{
public:
    void Call() { m.Call(); }

private:
    MockClass m;
}

现在您可以控制源代码,您无需更改已测试代码的设计,也可以排除生产实施。您测试的代码当然必须更改为:

void my_method()
{
    Wrapper c;
    c.Call();
}

答案 1 :(得分:1)

我不确定我到底知道您的问题是什么,但可能值得查看$sub$$$super$$的文档:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0206j/Chdefdce.html