如何在Visual Studio中正确设置“库链”?

How to properly setup a "library-chain" in visual studio?

提问人:Magnus Nyqvist 提问时间:10/28/2022 最后编辑:Magnus Nyqvist 更新时间:10/29/2022 访问量:69

问:

我在 visual studio 2022 中为我的可执行项目设置库配置时遇到问题。
在我的解决方案中,我有以下三个项目:

  • 通用 (lib)
  • 渲染 (lib)
  • 游戏(可执行文件)

这个想法是,通用库应该包含在我将来要添加到我的解决方案中的每个库中,最后,游戏项目将包括我的解决方案中的所有其他库项目。

所以:Render.lib 使用的是 Common.lib。Game.exe 正在使用 Render.lib 和 Common.lib。

目前,Common 库和 Render 库的构建完全没有问题,但由于链接到 Render 项目,Game 项目将无法构建。

项目设置

每个项目都有三个目录:ExternalIncludeSource
每个项目都有自己的预编译头文件。

External 目录包含一个 include 目录,lib 目录包含一个目录。include 目录保存 lib 目录中库文件的所有包含文件。
Include 目录包含当前项目的所有包含文件。
Source 目录包含当前项目的所有源文件。

建筑

  • 首先,构建 Common 库,并将其包含文件复制到 Render/External/Include/Common/ 和 Game/External/Include/Common。Common lib 文件被复制到 Render/External/lib/Common.lib 和 Game/External/lib/Common.lib。

  • 其次,构建渲染库,并将其包含文件复制到 Game/External/Include/Render/。渲染库文件被复制到 Game/External/lib/Render.lib。(我还尝试将 Render 项目 External 目录复制到 Game 项目 External/lib/ 目录)。

  • 第三,游戏项目已构建,在这里我得到了渲项目的链接错误。

游戏属性页:

[VC++ 目录]
外部包含目录:$(ProjectDir)External\include
库目录:$(ProjectDir)External\lib

[链接器->输入]
其他依赖项: Common.lib;渲染.lib


  • 以前有没有人做过这个解决方案设置?

  • 关于我做错了什么,有什么建议吗?

先谢谢你!

我试图在游戏属性页中摆弄,看看我是否可以在我的配置中找到任何逻辑错误。如果预编译的标题与我的链接问题有关,我还尝试删除它们(我也尝试复制它们而不是复制它们)。

我所做的更改除了找不到外部项目的包含文件之外没有产生任何其他结果......

编辑: 这是链接错误:

1>RenderEngine_Debug.lib(Renderer.obj) : error LNK2001: unresolved external symbol "private: static class Render::Renderer Render::Renderer::gRenderer" (?gRenderer@Renderer@Render@@0V12@A)
1>RenderEngine_Debug.lib(WindowEvent.obj) : error LNK2001: unresolved external symbol "private: static class std::vector<struct Render::Event::Message,class std::allocator<struct Render::Event::Message> > Render::Event::EventHandler::myEventQueue" (?myEventQueue@EventHandler@Event@Render@@0V?$vector@UMessage@Event@Render@@V?$allocator@UMessage@Event@Render@@@std@@@std@@A)
1>RenderEngine_Debug.lib(WindowEvent.obj) : error LNK2001: unresolved external symbol "private: static class std::unordered_map<enum Render::Event::Type,class std::unordered_map<class Render::Event::Subscriber *,bool,struct std::hash<class Render::Event::Subscriber *>,struct std::equal_to<class Render::Event::Subscriber *>,class std::allocator<struct std::pair<class Render::Event::Subscriber * const,bool> > >,struct std::hash<enum Render::Event::Type>,struct std::equal_to<enum Render::Event::Type>,class std::allocator<struct std::pair<enum Render::Event::Type const ,class std::unordered_map<class Render::Event::Subscriber *,bool,struct std::hash<class Render::Event::Subscriber *>,struct std::equal_to<class Render::Event::Subscriber *>,class std::allocator<struct std::pair<class Render::Event::Subscriber * const,bool> > > > > > Render::Event::EventHandler::mySubscribers" (?mySubscribers@EventHandler@Event@Render@@0V?$unordered_map@W4Type@Event@Render@@V?$unordered_map@PEAVSubscriber@Event@Render@@_NU?$hash@PEAVSubscriber@Event@Render@@@std@@U?$equal_to@PEAVSubscriber@Event@Render@@@5@V?$allocator@U?$pair@QEAVSubscriber@Event@Render@@_N@std@@@5@@std@@U?$hash@W4Type@Event@Render@@@5@U?$equal_to@W4Type@Event@Render@@@5@V?$allocator@U?$pair@$$CBW4Type@Event@Render@@V?$unordered_map@PEAVSubscriber@Event@Render@@_NU?$hash@PEAVSubscriber@Event@Render@@@std@@U?$equal_to@PEAVSubscriber@Event@Render@@@5@V?$allocator@U?$pair@QEAVSubscriber@Event@Render@@_N@std@@@5@@std@@@std@@@5@@std@@A)
1>RenderEngine_Debug.lib(WindowEvent.obj) : error LNK2001: unresolved external symbol "private: static bool Render::Event::EventHandler::SkipEvents" (?SkipEvents@EventHandler@Event@Render@@0_NA)
1>D:\Projects\Steve\Steve\x64\Debug\GameEngine.exe : fatal error LNK1120: 4 unresolved externals
1>Done building project "GameEngine.vcxproj" -- FAILED.
C++ 配置 static-libraries 链接器错误 visual-studio-2022

评论

0赞 Botje 10/28/2022
VS 没有“项目引用”,因此您可以简单地链接到生成的工件吗?
0赞 Magnus Nyqvist 10/28/2022
@rainbow.gekota 嗨,我现在已将链接错误添加到我的帖子中。很抱歉遗漏了它。我认为实际的链接错误消息有点具体,没有任何帮助。
0赞 Magnus Nyqvist 10/28/2022
@Botje 也许,我以前没有使用过这种配置。
0赞 rainbow.gekota 10/29/2022
我很高兴你的问题得到了解决。至于它的解决方式是否对其他用户有帮助,我不太确定,因为问题帖子不包含与链接错误相关的代码。这是不可重现的。

答:

0赞 Magnus Nyqvist 10/29/2022 #1

好吧,我想通了...... 似乎我的配置没有错误,我只是忘记定义您可以在链接错误中看到的静态变量。

有了这个修复,一切都很好,工作正常!

谢谢你,很抱歉你花时间做这件事......