链接包含相同符号的不同项目中的两个目标文件时出现C ++链接器错误

时间:2013-08-14 10:44:23

标签: c++ visual-studio linker dependencies c++-cx

我有两个项目(ProjA和ProjB)。在ProjA中,我创建了包含TypeA定义的TypeA.obj。 ProjB依赖于ProjA。在ProjB的Sth.obj中我使用TypeA。

问题出现在ProjC的链接器阶段,它连接TypeA.obj和Sth.obj。我得到错误,说TypeA已经在Sth.obj中定义。

是否可以在c ++中链接多个obj文件,每个文件包含相同的符号(在本例中为TypeA符号)?

EDIT!

好的,现在我将详细介绍。首先,当我开始这个线程时,我将我的问题描述为与c ++有关, 即使我有c ++ / cx的问题。我认为这是c ++和c ++ / cx的一般问题。经过一番分析 我不这么认为了。原谅我这个错误。

最重要的是我的问题只与c ++ / cx有关。

下面我将向您介绍我在visual studio中的解决方案的详细说明

ProjA
    #####MyType.h#####
    #pragma once
    namespace N1
    {
    public ref class MyType sealed
    {
    };
    }

    #####MyType.cpp#####
    #include "pch.h"
    #include "MyType.h"

ProjB
    #####MyTypeUser.h#####
    namespace N2
    {
    [Windows::Foundation::Metadata::WebHostHidden]
    public ref class MyTypeUser sealed
    {
    public:
        void DoSth(N1::MyType){}
    }
    }

    #####MyTypeUser.cpp#####
    #include "pch.h"
    #include "MyTypeUser.h"

ProjC
    links MyType.obj and MyTypeUser.obj

在ProjC的链接器阶段,我得到MyType已在MyType.obj或MyTypeUser中定义的错误(依赖于首先链接的)。

2 个答案:

答案 0 :(得分:0)

您需要为这些项目创建名称空间,并使用这些名称空间来标识单个对象。与我们使用std命名空间相同。

std::cout << "Hello World!" <<std::endl;

答案 1 :(得分:0)

即使它们完全相同,也不可能多次出现一个类定义。您需要以不同的方式设置项目。可以将同一个类包装到不同的名称空间中以避免冲突,但是这种情况会导致以后非常痛苦的维护问题。现在更好地解决它。

为什么不创建另一个独立于其他项目的项目,它只包含你在几个地方需要的类(或其他类型定义)?

您可能希望在问题中添加另一个标记(例如Visual C ++?),以获取有关如何重构项目的更具体帮助,具体取决于您的IDE。