Visual studio Visual C++中多个项目间的链接错误

Visual studio Visual C++中多个项目间的链接错误,visual-studio,visual-c++,projects-and-solutions,Visual Studio,Visual C++,Projects And Solutions,我有一个多项目的解决方案。我有一个主项目,它作为一个菜单,从那里,用户可以访问任何其他项目。在这个主项目中,我为每个调用的函数获取链接器错误。如何避免这些链接器错误?我已在项目依赖项中设置了项目依赖项。。。对话 谢谢 编辑-我按照建议做了,并将输出文件夹添加到链接器的附加目录中。然而,现在我得到了一百万个错误,如下所示: 在不了解解决方案的任何其他细节的情况下,很难说清楚,但是“全部重建”可能会有所帮助。当存在不同体系结构的混合对象文件时,有时会出现这种情况 您可能还想考虑使用引用而不是依赖项

我有一个多项目的解决方案。我有一个主项目,它作为一个菜单,从那里,用户可以访问任何其他项目。在这个主项目中,我为每个调用的函数获取链接器错误。如何避免这些链接器错误?我已在项目依赖项中设置了项目依赖项。。。对话

谢谢

编辑-我按照建议做了,并将输出文件夹添加到链接器的附加目录中。然而,现在我得到了一百万个错误,如下所示:


在不了解解决方案的任何其他细节的情况下,很难说清楚,但是“全部重建”可能会有所帮助。当存在不同体系结构的混合对象文件时,有时会出现这种情况

您可能还想考虑使用引用而不是依赖项

编辑:


在您发布之后,您与标准库的链接似乎不一致。是否有一个项目静态链接标准库,而其他项目动态链接标准库?请参阅项目属性->链接器或一个到发布运行时的链接器,而其他链接器要调试吗?虽然最后一个应该是可能的,但有一些警告

我假定您得到的链接器错误是针对未解析的符号

如果使用静态库,即.lib文件,则需要将库添加到链接器输入中,以便在链接时可以链接符号。如果不执行此操作,将得到一个未解析的符号:

在项目上单击鼠标右键,然后选择“属性”。 选择配置属性->链接器->输入 在附加依赖项下输入库名称,例如filename.lib。
其他项目中的功能是否已导出?如果它们没有被导出,那么主exe中就没有可链接的内容,因此会导致错误。有关详细信息,请参阅。

在不了解解决方案的所有详细信息的情况下,很难回答此问题,但我假设您的其他项目已设置为生成.lib文件,然后主项目将链接所有这些lib文件。如果是这种情况,那么您得到的错误的一个可能原因是您的项目链接到运行库的不同版本

从中,传递给链接器给定调用的所有模块必须使用相同的运行时库编译器选项/MD、/MT、/LD进行编译


尝试将所有项目更改为使用相同版本的运行库。在VisualStudio2010中,它位于项目的属性|配置属性| C/C++|代码生成|运行库中。为调试配置选择多线程调试DLL或多线程调试。

您收到的错误是“错误LNK2005”,其中链接msvcprtd.lib的库中的符号已在另一个库中定义,例如panels.lib。如果将panels.lib添加到VS2008配置属性->链接器->输入->忽略特定库中的“忽略特定库”字段,则错误将停止

我遇到了一个与此非常相似的问题,这是因为我的一个库将选项“将wchar\u t视为内置类型”设置为与其他库不同的值。默认情况下,此设置在新项目上为false。将它们全部更改为true修复了问题

确切地说,您的项目中至少有一个是使用不同的运行时库编译的,而不是其他项目。也许您使用不同的默认值添加了一个新的。检查项目的属性,查看配置属性->C/C++->代码生成->运行库的相等值。

在我的例子中,问题是因为我将函数原型、类定义、函数实现和类实现保存在一个cpp文件中。只有当我将声明和原型转移到单独的头文件时,这些错误才消失。真奇怪

在我的例子中,我有两种方法:

项目属性->C/C++->代码生成->运行库。换成MT

将缺少库添加到:链接器->输入->其他依赖项。如果不起作用,请尝试添加完整路径,而不是库名称

例如:C:\ProgramFilesx86\Microsoft Visual Studio 14.0\VC\lib\amd64\libvcruntime.lib


这对我很有用。请回答这个问题,因为任何人都需要帮助。

在Visual Studio中添加项目依赖项时,它会自动链接到项目的输出,但不会将.lib添加到属性中。我认为引用仅用于.NET项目。虽然OP没有用这种方式来说明,但我猜想他是用非托管C++编写的。谢谢提到不一致的链接/MT对/MD。我没有想到这一点,并使这一点一致地解决了我的LNK2005错误。谢谢,达尼!我遇到了这个问题,你的解决方案是正确的。我的静态库的运行时库设置为多线程调试,而链接到它的应用程序设置为Multithread Debug
eaded调试DLL。更改运行时库设置以便所有内容都匹配修复了链接器错误。这是导致我失败的原因。谢谢你,这不正是Dani van der Meer三年前说的吗?
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ios >::setstate(int,bool)" (?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (?width@ios_base@std@@QAEHH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputn(char const *,int)" (?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static bool __cdecl std::char_traits::eq_int_type(int const &,int const &)" (?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static int __cdecl std::char_traits::eof(void)" (?eof@?$char_traits@D@std@@SAHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputc(char)" (?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_streambuf > * __thiscall std::basic_ios >::rdbuf(void)const " (?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: char __thiscall std::basic_ios >::fill(void)const " (?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::flags(void)const " (?flags@ios_base@std@@QBEHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(void)const " (?width@ios_base@std@@QBEHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static unsigned int __cdecl std::char_traits::length(char const *)" (?length@?$char_traits@D@std@@SAIPBD@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > & __thiscall std::basic_ostream >::flush(void)" (?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > * __thiscall std::basic_ios >::tie(void)const " (?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: bool __thiscall std::ios_base::good(void)const " (?good@ios_base@std@@QBE_NXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ostream >::_Osfx(void)" (?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Lock(void)" (?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::locale::facet * __thiscall std::locale::facet::_Decref(void)" (?_Decref@facet@locale@std@@QAEPAV123@XZ) already defined in panels.lib(panel_main.obj)
3>libcpmtd.lib(ios.obj) : error LNK2005: "private: static void __cdecl std::ios_base::_Ios_base_dtor(class std::ios_base *)" (?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(ios.obj) : error LNK2005: "public: static void __cdecl std::ios_base::_Addstd(class std::ios_base *)" (?_Addstd@ios_base@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "void __cdecl _AtModuleExit(void (__cdecl*)(void))" (?_AtModuleExit@@YAXP6AXXZ@Z) already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: __Fac_tidy already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static void __cdecl std::locale::facet::facet_Register(class std::locale::facet *)" (?facet_Register@facet@locale@std@@CAXPAV123@@Z) already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Getgloballocale(void)" (?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Init(void)" (?_Init@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_ctor(class std::_Locinfo *,class std::basic_string,class std::allocator > const &)" (?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_dtor(class std::_Locinfo *)" (?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::_Lockit(int)" (??0_Lockit@std@@QAE@H@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QAE@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)