在 VS2012 中链接源和库目录

Posted

技术标签:

【中文标题】在 VS2012 中链接源和库目录【英文标题】:Linking source and library directories in VS2012 【发布时间】:2014-01-28 07:55:14 【问题描述】:

距离我上次使用 C++ 已有 2 年了。过去我使用 VS2008,一切都很好,现在我刚刚切换到 VS2012,似乎我无法配置使用任何其他源和库目录,总是得到 LNK2001 和 LNK2019 错误,即使它们是我所做的精确配置VS2008。

抱歉,我认为图片可以帮助人们检查我是否在正确的位置进行了设置。 VS2012 让我很困惑。

我尝试过使用 Diluculum,这是我在 VS2012 中的配置:

我不确定我的配置是否适合这个版本的 Visual Studio。我试图自己找到一种方法,但已经有 4 天没有任何过程来运行一个简单的源。好郁闷。

编辑:

Diluculum 的错误:

1>------ Build started: Project: test, Configuration: Release Win32 ------
1>moc_mainwindow.obj : error LNK2019: unresolved external symbol "public: __thiscall Diluculum::LuaValue::LuaValue(void)" (??0LuaValue@Diluculum@@QAE@XZ) referenced in function "void __cdecl Diluculum::`dynamic initializer for 'Nil''(void)" (??__ENil@Diluculum@@YAXXZ)
1>main.obj : error LNK2001: unresolved external symbol "public: __thiscall Diluculum::LuaValue::LuaValue(void)" (??0LuaValue@Diluculum@@QAE@XZ)
1>mainwindow.obj : error LNK2001: unresolved external symbol "public: __thiscall Diluculum::LuaValue::LuaValue(void)" (??0LuaValue@Diluculum@@QAE@XZ)
1>moc_mainwindow.obj : error LNK2019: unresolved external symbol "public: __thiscall Diluculum::LuaValue::LuaValue(class std::map<class Diluculum::LuaValue,class Diluculum::LuaValue,struct std::less<class Diluculum::LuaValue>,class std::allocator<struct std::pair<class Diluculum::LuaValue const ,class Diluculum::LuaValue> > > const &)" (??0LuaValue@Diluculum@@QAE@ABV?$map@VLuaValue@Diluculum@@V12@U?$less@VLuaValue@Diluculum@@@std@@V?$allocator@U?$pair@$$CBVLuaValue@Diluculum@@V12@@std@@@4@@std@@@Z) referenced in function "void __cdecl Diluculum::`dynamic initializer for 'EmptyTable''(void)" (??__EEmptyTable@Diluculum@@YAXXZ)
1>main.obj : error LNK2001: unresolved external symbol "public: __thiscall Diluculum::LuaValue::LuaValue(class std::map<class Diluculum::LuaValue,class Diluculum::LuaValue,struct std::less<class Diluculum::LuaValue>,class std::allocator<struct std::pair<class Diluculum::LuaValue const ,class Diluculum::LuaValue> > > const &)" (??0LuaValue@Diluculum@@QAE@ABV?$map@VLuaValue@Diluculum@@V12@U?$less@VLuaValue@Diluculum@@@std@@V?$allocator@U?$pair@$$CBVLuaValue@Diluculum@@V12@@std@@@4@@std@@@Z)
1>mainwindow.obj : error LNK2001: unresolved external symbol "public: __thiscall Diluculum::LuaValue::LuaValue(class std::map<class Diluculum::LuaValue,class Diluculum::LuaValue,struct std::less<class Diluculum::LuaValue>,class std::allocator<struct std::pair<class Diluculum::LuaValue const ,class Diluculum::LuaValue> > > const &)" (??0LuaValue@Diluculum@@QAE@ABV?$map@VLuaValue@Diluculum@@V12@U?$less@VLuaValue@Diluculum@@@std@@V?$allocator@U?$pair@$$CBVLuaValue@Diluculum@@V12@@std@@@4@@std@@@Z)
1>moc_mainwindow.obj : error LNK2019: unresolved external symbol "private: void __thiscall Diluculum::LuaValue::destroyObjectAtData(void)" (?destroyObjectAtData@LuaValue@Diluculum@@AAEXXZ) referenced in function "public: void __thiscall std::_Wrap_alloc<class std::allocator<struct std::_Tree_node<struct std::pair<class Diluculum::LuaValue const ,class Diluculum::LuaValue>,void *> > >::destroy<struct std::pair<class Diluculum::LuaValue const ,class Diluculum::LuaValue> >(struct std::pair<class Diluculum::LuaValue const ,class Diluculum::LuaValue> *)" (??$destroy@U?$pair@$$CBVLuaValue@Diluculum@@V12@@std@@@?$_Wrap_alloc@V?$allocator@U?$_Tree_node@U?$pair@$$CBVLuaValue@Diluculum@@V12@@std@@PAX@std@@@std@@@std@@QAEXPAU?$pair@$$CBVLuaValue@Diluculum@@V12@@1@@Z)
1>main.obj : error LNK2001: unresolved external symbol "private: void __thiscall Diluculum::LuaValue::destroyObjectAtData(void)" (?destroyObjectAtData@LuaValue@Diluculum@@AAEXXZ)
1>mainwindow.obj : error LNK2001: unresolved external symbol "private: void __thiscall Diluculum::LuaValue::destroyObjectAtData(void)" (?destroyObjectAtData@LuaValue@Diluculum@@AAEXXZ)
1>C:\Users\User\documents\visual studio 2012\Projects\test\Win32\Release\\test.exe : fatal error LNK1120: 3 unresolved externals

========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========

【问题讨论】:

请不要在可以添加文字的情况下添加图片,增加不必要的混乱。 其实图片很有用。将附加包含放在“C/C++ -> 常规 -> 附加包含目录”中而不是像您拥有的那样放在 VC++ 目录中更为正常。这意味着“系统”包括,即标准库。 很抱歉,虽然图像可以帮助人们检查我是否在正确的位置设置了东西。 VS2012 让我很困惑。我也尝试在“C/C++ -> 常规 -> 附加包含目录”中进行配置,但仍然遇到相同的错误。 【参考方案1】:

似乎您正在链接库的静态版本。这意味着,您的 CRT 包含在这些库中。但是 CRT 对于不同版本的 Visual Studio 是不同的。您只能对在完全相同的 Visual Studio 中编译的版本使用静态链接。

SFML download page 有适用于不同版本 Visual Studio 的软件包。

【讨论】:

非常感谢米哈伊尔。但我直接链接到 Diluculum 的源代码,对于 SFML,我确定我使用的是其静态库的 VC++11 (2012) 版本。 更新您的问题并包含您从链接器获得的确切错误消息。 看起来不像 CRT 问题或任何配置不兼容。但是我看到您在使用动态版本的库时定义了 SFML_STATIC 宏。使其一致。删除宏,或链接到静态版本:带有-s(发布)或-s-d(调试)后缀。 非常感谢米哈伊尔!我真是个空头!在我链接到 -s 版本之后,现在可以使用 SFML。但是我仍然遇到 Diluculum 错误,试图将它的源代码直接放到我的项目中,但错误仍然相同。非常感谢您帮助我编辑我的帖子。 似乎您没有正确链接 Lua。很难从日志中说出更多信息。

以上是关于在 VS2012 中链接源和库目录的主要内容,如果未能解决你的问题,请参考以下文章

在VS2010的VC++中如何编译、链接、运行、调试程序

编译链接实战添加头文件路径和库路径

vs2005无法定位程序输入点怎么解决?

Qt Creator 项目和库的统包分发?

识别所需的链接库

链接库.a和库.lib