Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使链接器更喜欢从给定位置实现_C++_Linker_Symbian_Arm - Fatal编程技术网

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

C++ 如何使链接器更喜欢从给定位置实现,c++,linker,symbian,arm,C++,Linker,Symbian,Arm,我需要一种方法使链接器更喜欢一种实现而不是另一种。我的用例如下:我正在编写单元测试,需要模拟一些对象。问题是这些对象都在“main”库中,即使在调试过程中我也不能丢弃它们,因为许多SDK都存在于其中 所以我实现了这些mock,但现在链接器似乎更喜欢从“main”库实现,至少我的代码没有被调用。我使用ARM RVCT 4 C++编译器,Symbian工具链,如果这是重要的。 非常感谢您的任何想法(甚至是解决方法) 编辑:我需要模拟静态方法调用,这可能很重要,因为我认为与普通方法相比,静态方法是以其

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

所以我实现了这些mock,但现在链接器似乎更喜欢从“main”库实现,至少我的代码没有被调用。我使用ARM RVCT 4 C++编译器,Symbian工具链,如果这是重要的。 非常感谢您的任何想法(甚至是解决方法)


编辑:我需要模拟静态方法调用,这可能很重要,因为我认为与普通方法相比,静态方法是以其他方式链接的。

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

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

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

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

void my_method()
{
    ProblematicClass c;
    c.Call();
}
problematicsclass
在两个地方实现:一个在SDK中,另一个是您的模拟。如果可以将
problematicsclass
包装到另一个类中,则可以创建两个源文件:

生产文件:

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();
}

我不确定我是否完全理解您的问题所在,但可能值得查看
$sub$$$
$super$$
的文档。

谢谢您的回答。是的,这会有帮助,但在目前的情况下,由于某些原因,我不能这样做(很多代码需要以这种方式重构,我们没有时间这样做)。顺便说一句,链接阶段的模拟是非常流行的技术,至少在我们的项目中是如此。但通常你可以通过不将它链接到exe来摆脱真正的实现,在我的具体案例中,由于问题中所述的原因,这种方式是不可能的。关于你的编辑:是的,昨天我决定完全采用同样的方式,实现包装器并模拟它。所以我会接受你的新答案谢谢这在这里没有帮助,但这是非常有趣的东西。