链接来自包含相同符号的不同项目的两个对象文件时发生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。我收到错误,说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。
相关文章:
- 无法链接文件系统库C++
- 如何在C++中链接 .a 文件
- 在为 Java 编译动态链接文件时,我应该选择哪些 g++ 参数
- Makefile 将在文件更改时链接文件,但不会重新编译更改的源文件
- CMake 从子目录和父目录链接文件
- 如何将GCC链接器固定地址添加到链接文件中
- 在GCC中链接.h文件
- 使用GDB中的多个链接文件进行调试
- visualstudio2010表达了不同项目中的链接文件
- 编译器是否会优化未使用的链接文件
- 尝试取消链接文件时编译 C++ 时出错
- 链接文件错误,VS 2015中的错误LNK2005
- 用C++中的链接文件编译错误
- Makefile未链接.o文件
- 如何链接.h文件中声明为extern的函数,以创建.dll文件
- 通过makefiles链接文件
- 未定义的引用错误,即使在链接c文件之后
- 多个链接c++文件
- 使用CMakeLists.txt链接c++文件
- 在c++中链接文件