我有一个单元测试文件,它是大型框架的一部分。我在测试中使用的一些框架类是模拟版本,以返回测试所需的值。那就是我在我自己的c源文件中重新定义了一些框架类。
有没有办法强制Linux上的ld使用我自己的框架类对象,而不是从链接器行中删除框架库?我无法真正删除库,因为我仍在使用某些框架对象而不进行修改。
这是链接错误:
/usr/lib/gcc/x86_64-redhat-linux/4.4.5 /../../../../包括/ C ++ / 4.4.5 /比特/ char_traits.h:250:
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
MyClass'的多重定义:
答案 0 :(得分:1)
将包含您自己的框架类的对象或库文件放在ld
命令行上的大型框架库之前,但是在使用它们的对象/库文件之后。如果您打算将自己的框架类用于大型框架(也是如此),那么您就不走运了。
错误消息显示符号的第一个分辨率来自frameworklib.a
,重新定义发生在my_ut.o
中。这表明frameworklib.a
发生在my_ut.o
命令行ld
之前{{1}}。然而,这是一个复杂因素,定义似乎也来自头文件(C ++)。我不是C ++方面的专家,但可以想象,通过在不同的地方使用不同的包含文件,这两个定义实际上都包含在应用程序中。如果你想要否决类定义,你可能应该确保所有类的出现都被否决了。如果是这种情况,我会建议你花点时间和同事讨论,为单元测试提出一个好的设计。
答案 1 :(得分:1)
事实证明,无论命令行上对象的顺序如何,我的ld版本都会在出现多个定义时出错。 -z muldefs更改了此行为。
ld --version GNU ld版本2.20.51.0.2-5.20.el6 20091009 版权所有2009 Free Software Foundation,Inc。