提问者:小点点

在Visual Studio C++项目中包含源库的正确方式是什么?


现在,我正在尝试用Visual Studio2019创建我的第一个C++“真正的”项目。 我需要包括一个第三方库作为一个依赖项。 项目主页上的说明只是建议将所有源文件/头文件直接包含到项目中。 我的理解是,这是一个不好的做法,因为最终结果在任何风投看来都是相当难看的。

谢天谢地,库作者还提供了构建脚本,这些脚本用适当的参数调用cl,lib和link,并生成梦寐以求的foo.lib。 我将该文件添加到链接器选项中的依赖项中,在使用编译器/链接器选项进行了一番长篇大论之后,最终使其运行。

令我苦恼的是,我意识到我已经在发布配置中完成了所有这些操作,这使我无法使用调试器。 然后我用/mdd构建了库,修正了一些编译器选项。。。 并且在vcruntime.h中出现了一个奇怪的编译时错误(致命错误C1189:#error:_has_cxx17和_has_cxx20必须都定义,并且_has_cxx20必须暗示_has_cxx17)。

在这一点上,我知道我做了一件非常错误的事情,因为包含一个简单的库应该不需要那么多的手动调节。 在Visual Studio(以及通常的C++)中包含第三方依赖项的正确的,规范的方式是什么? 假设依赖项在Nuget,vcpkg或其他一些工具上不可用。


共3个答案

匿名用户

我从你在Windows上做的事情中了解到。 首先,我建议您尝试linux发行版。 在windows中,让lib文件运行是可能的,但并不容易。 如果你能给我发一个你正在使用的图书馆的链接,那会有帮助的。

匿名用户

通常的方法是将这些源代码放在自己的目录和自己的Visual Studio项目(而不是解决方案)中。 这仍然可以构建foo.lib。 您不需要太多的选择。

接下来,只需告诉Visual Studio您自己的项目依赖于其他项目,然后它将为您链接foo.lib

话虽如此,但听起来似乎您试图用不同的C++版本设置来构建您的两个项目。 VS2019对C++17有很好的支持,对C++20有实验支持,大家可以选择。 但您需要一致地为您的所有项目进行选择。

在较大的解决方案中,您可以使用。vsprops文件来实现该目标,它类似于项目文件的#include。 当你有两个项目的时候,有点过分了,当你有150个项目的时候,这是一个救命稻草。

匿名用户

包含第三方库的方式略有不同,有时第三方库有一个安装,安装它们自己就像在公共组件下,有时你必须手动完成。

E.g. YourSolution/3rdParty/foo/include
     YourSolution/3rdParty/foo/lib 
     YourSolution/3rdParty/foo/lib/release 
     YourSolution/3rdParty/foo/lib/debug

有时库有不同的名称,那么它们可能在同一个文件夹中。

一旦你有了这个结构,转到你的项目的属性C/C++,并添加include在附加的include目录下,确保你有配置“所有配置”在这里。 然后转到Project Properties/Linker/Input和Debug配置和Release配置的依赖项,因为通常每个配置都是不同的库。 例如release/foo.lib和debug/foo.lib(foo.lib foo-d.lib或其他名称)。

使用宏确保获得正确的位置,以便它们相对于您的解决方案和项目。 拥有绝对路径是不好的。 例如。 $(SolutionDir)3rdParty\foo\include

免责声明:我不确定这是“最佳”的方式来做这件事,但这就是我做这件事的方式。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(visual|studio|c++|项|目中|包含|源|库|方式)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?