【问题标题】:C++ linker error when linking two object files from differen projects containing the same symbol链接来自包含相同符号的不同项目的两个目标文件时出现 C++ 链接器错误
【发布时间】:2013-08-16 06:44:50
【问题描述】:

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

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

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

编辑!

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

【问题讨论】:

  • 尝试(但失败)SSCCE 可能会提供更多信息。除此之外,这听起来就像您应该使用动态代码模块(例如,Windows 中的 DLL,Linux 中的 .so)来实现 TypeA。跨度>

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • ProjC 链接的两个 obj 文件包含完全相同的类型 TypeA。链接两个同名的不同类型不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多