C ld手动解析多个定义

C ld手动解析多个定义,c,ld,C,Ld,我有一个单元测试文件,它是大型框架的一部分。我在测试中使用的一些框架类是模拟版本,用于返回测试所需的值。也就是说,我在自己的c源文件中重新定义了一些框架类 除了从链接器行中删除框架库之外,有没有办法强制Linux上的ld使用我自己的框架类对象?我无法真正删除这些库,因为我仍在使用一些未经修改的框架对象 这是链接错误: /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../../../../../include/c++/4.4.5/bits/char

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

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

这是链接错误:

/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../../../../../include/c++/4.4.5/bits/char_traits.h:250:
MyClass::MyClass'的多个定义
build/Debug/GNU-Linux-x86/tests/tests/my_ut.o:/usr/lib/gcc/x86\u 64-redhat-Linux/4.4.5/../../../../../../../include/c++/4.4.5/exception:62:
首先在这里定义../frameworklib.a(MyClass.o):在函数中
MyClass':


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


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

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


错误消息显示符号的第一个分辨率来自
frameworklib.a
,重新定义发生在
my_ut.o
中。这表明
frameworklib.a
出现在
ld
命令行上的
my_ut.o
之前。然而,定义似乎也来自头文件(C++),这是一个复杂的因素。我不是C++专家,但可以想象,这两个定义实际上是通过在不同的地方使用不同的包含文件而被包含在应用程序中的。如果您想要否决类定义,您可能应该确保所有出现的类都被否决。如果是这样的话,我建议您花点时间与同事讨论,为单元测试提出一个好的设计。

结果是,如果有多个定义,我的ld版本会出现错误,而不管命令行上对象的顺序如何。这些变化改变了这种行为

ld—版本 GNU ld版本2.20.51.0.2-5.20.el6 20091009 版权所有2009免费软件基金会,公司


事实证明,如果存在多个定义,则无论命令行上对象的顺序如何,我的ld版本都会出现错误。这些变化改变了这种行为

ld—版本 GNU ld版本2.20.51.0.2-5.20.el6 20091009 版权所有2009免费软件基金会,公司


我确实按照您描述的方式更改了顺序,但是收到了相同的链接器错误消息。我确实按照您描述的方式更改了顺序,但是收到了相同的链接器错误消息。这听起来像是一个危险的选择。你最好确保使用了正确的符号。您的两个框架都是对象(
.o
)文件还是也有库(
.a
)?根据我的经验,库不会导致多个定义。对象文件总是包含在内,因此多个定义是有意义的。我添加到问题中的错误消息清楚地表明,冲突的定义来自存档库。单元测试对象只是对象。您在回答中提到将定义单元测试版本的“对象或库”文件放在框架库之前。我添加了进一步的分析,但这是对我经验的延伸。这听起来像是一个危险的选择。你最好确保使用了正确的符号。您的两个框架都是对象(
.o
)文件还是也有库(
.a
)?根据我的经验,库不会导致多个定义。对象文件总是包含在内,因此多个定义是有意义的。我添加到问题中的错误消息清楚地表明,冲突的定义来自存档库。单元测试对象只是对象。您在回答中提到将定义单元测试版本的“对象或库”文件放在框架库之前。我添加了进一步的分析,但这是对我的经验的延伸。