繁体   English   中英

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

[英]C++ linker error when linking two object files from differen projects containing the same symbol

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

问题出现在ProjC的链接器阶段,该阶段链接TypeA.obj和Sth.obj。 我收到错误消息,说Sth.obj中已经定义了TypeA。

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

编辑!

好的,现在我将详细介绍。 首先,当我启动此线程时,即使我在使用c ++ / cx时遇到问题,也将自己的问题描述为与c ++有关。 我认为这是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中定义(取决于先链接的)。

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

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

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

为什么不创建一个与其余项目无关的另一个项目,该项目仅在多个位置包含您需要的类(或其他类型定义)?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM