如何使链接器更喜欢从给定位置实现
How to make linker prefer implementation from a given location
我需要一种方法使链接器更喜欢一种实现而不是另一种。我的用例如下:我正在编写单元测试,我需要模拟一些对象。问题是那些对象在"主"库中,即使在调试中我也不能扔掉,因为许多SDK的东西都在那里。
所以我已经实现了这些模拟,但现在看来,链接器更喜欢从"主"库实现,至少我的代码没有被调用。我使用ARM RVCT 4 c++编译器与Symbian工具链,如果这是重要的。
任何想法(甚至变通方法)都非常感谢!
编辑:我需要模拟静态方法调用,可能这很重要,因为我认为静态方法与普通方法相比以其他方式联系在一起。
通常mock不是在链接阶段完成的,而是在代码中解决的。依赖注入是首选技术之一。也就是说,您应该对代码进行建模,以便可以在真实实现和模拟实现之间进行选择。
例如,您想在代码中创建对象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();
}
我不确定我完全理解你的问题是什么,但它可能值得检查$sub$$
和$super$$
的文档:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0206j/Chdefdce.html。
- 将值指定给向量(2D)的向量中的某个位置
- 使用Unreal C++获取VR耳机的世界位置/方向
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 无法获取webot::PositionSensor对象中位置传感器的值
- 非常量变量只读位置的赋值
- 如何定义更改car类中car位置的方法
- 使用迭代器时如何访问对象在向量中的位置?
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 求最大元素位置的分治算法
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 是与初始类同一内存位置的重新定位类
- 如何在使用网格布局时重叠qwidgets,并将重叠的widget定位在距离窗口边界特定距离的位置
- 我不知道如何定位最高随机数的位置
- 如何在MFC上设置窗口位置以将其定位到屏幕顶部
- 将QGraphicsSvgItem的中心定位在一个位置上。
- 如何定位WinRT异步方法调用中出现错误的位置
- 重定位表项在平面二进制文件中的存储位置