2

我有一个单元测试文件,它是大型框架的一部分。我在测试中使用的一些框架类是模拟版本以返回我测试所需的值。那就是我在自己的c源文件中重新定义了一些框架类。

除了从链接器行中删除框架库之外,有没有办法在 Linux 上强制 ld 使用我自己的框架类对象?我无法真正删除这些库,因为我仍在使用一些未经修改的框架对象。

这是链接错误:

MyClass::MyClass' build/Debug/GNU-Linux-x86/tests/tests/my_ut.o:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/exception:62: first defined here ../frameworklib.a(MyClass.o): In function /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/char_traits.h:250: MyClass'的多重定义:

4

2 回答 2

3

事实证明,我的 ld 版本在有多个定义的情况下会出现错误,而不管命令行上对象的顺序如何。-z muldefs改变了这种行为。

ld --version GNU ld 版本 2.20.51.0.2-5.20.el6 20091009 版权所有 2009 Free Software Foundation, Inc.

于 2013-04-05T13:13:09.697 回答
2

将包含您自己的框架类的对象或库文件放在命令行上大型框架的库之前ld,但在使用它们的对象/库文件之后。如果您希望自己的框架类也被大型框架使用,那么您就不走运了。

错误信息显示符号的第一个解析来自frameworklib.a并且重新定义发生在my_ut.o. 这表明frameworklib.a之前发生my_ut.old. 然而,定义似乎也来自头文件(C++)是一个复杂的因素。我不是 C++ 专家,但可以想象,通过在不同位置使用不同的包含文件,这两个定义实际上都包含在应用程序中。如果您想否决类定义,您可能应该确保所有出现的类都被否决。如果是这种情况,我建议您花一些时间与同事讨论,以提出一个好的单元测试设计。

于 2013-04-04T23:02:39.977 回答