链接来自包含相同符号的不同项目的两个对象文件时发生C++链接器错误

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

本文关键字:链接 文件 对象 错误 C++ 两个 包含相 符号 项目      更新时间:2023-10-16

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

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

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

编辑!

好的,现在我将详细介绍。首先,当我启动这个线程时,我将我的问题描述为与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中定义(取决于哪个先链接)。

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

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

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

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

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