11

我有一个包含多个项目的解决方案。我有一个“主”项目,它充当菜单,用户可以从那里访问任何其他项目。在这个主项目上,我得到每个调用的函数的链接器错误。如何避免这些链接器错误?我已经在“项目依赖项...”对话框中设置了项目依赖项。

谢谢

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

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)
4

9 回答 9

20

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

Microsoft 的文档中,“传递给链接器的给定调用的所有模块都必须使用相同的运行时库编译器选项(/MD、/MT、/LD)进行编译。”

尝试更改所有项目以使用相同版本的运行时库。在 Visual Studio 2010 中,这是在项目的属性 | 配置属性 | C/C++ | 代码生成 | 运行时库。选择多线程调试 DLL或多线程调试(用于您的调试配置)。

于 2009-03-03T10:32:23.097 回答
11

在不了解您的解决方案的任何其他细节的情况下,很难说,但是 Rebuild All 可能会有所帮助。当存在不同架构的混合目标文件时,有时会发生这种情况。

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

编辑:

在您发布之后,您与标准库的链接似乎不一致。会不会是其中一个项目静态链接标准库而其他项目动态链接?(见项目属性->链接器)或者一个到发布运行时,而其他的调试?(虽然最后一个应该是可能的,但需要注意的是)

于 2009-03-02T23:32:28.300 回答
2

你其他项目中的功能有导出吗?如果它们没有被导出,那么就没有任何东西可以从主 exe 链接到,所以这会导致错误。有关详细信息,请参阅使用 __declspec(export) 从 DLL 导出

于 2009-03-02T23:44:38.847 回答
1

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

于 2010-04-01T01:57:22.357 回答
0

我认为您得到的链接器错误是“未解析的符号”?

如果使用静态库(即 .lib 文件),您需要将库添加到链接器输入,以便在链接时可以链接符号。如果你不这样做,你会得到一个未解析的符号:

  1. 右键单击项目,然后选择属性。
  2. 选择配置属性->链接器->输入
  3. 在 Additional Dependencies 下输入库名称(例如 filename.lib)。
于 2009-03-02T23:33:36.893 回答
0

我有一个与此非常相似的问题,原来是因为我的一个库将选项“将 wchar_t 视为内置类型”设置为与其他库不同的值。默认情况下,此设置在新项目上为 false。将它们全部更改为 true 可以解决问题。

于 2011-05-12T12:33:00.717 回答
0

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

于 2012-12-06T10:52:57.683 回答
0

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

于 2013-03-01T03:35:34.207 回答
0

就我而言,我有两种方法:

  1. 项目属性 -> C/C++ -> 代码生成 -> 运行时库。将其更改为 MT。

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

例如:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\amd64\libvcruntime.lib;

这对我有用。为任何需要帮助的人回答这个问题。

于 2018-11-09T02:30:55.863 回答