【问题标题】:How to configure visual studio 2008 to select the correct .lib based on configuration?如何配置 Visual Studio 2008 以根据配置选择正确的 .lib?
【发布时间】:2012-01-04 21:23:19
【问题描述】:

assimp的发行版自带一个lib文件夹。该文件夹有以下子文件夹:

assimp_debug-dll_win32
assimp_debug-dll_x64
assimp_release-dll_win32
assimp_release-dll_x64

每个文件夹都有一个文件 assimp.lib。如何根据我的配置(调试/发布)包含正确的库?目前,assimp 位于我项目之外的文件夹中,我已将路径添加到 Tools->Options->VC++ Directories->Library files,但我不确定它是否正常工作。

【问题讨论】:

  • 如果您转到项目属性,每个配置(调试/发布...)都有自己的一组设置。您可以转到各个配置的链接器选项并设置其他库依赖项。

标签: c++ visual-studio-2008


【解决方案1】:

您可以使用预处理器指令来做到这一点:

#ifdef __DEBUG
#pragma comment(lib,"c:/Path/assimp_debug-dll_win32/assimp.lib")
#else
#pragma comment(lib,"c:/Path/assimp_release-dll_win32/assimp.lib")
#endif

【讨论】:

  • 这应该可以解决调试和发布构建的问题(我没有测试)。我还注意到一些库可以根据 c++ 运行时库是否为静态链接来选择它们的 lib 文件。你知道他们是怎么做到的吗?或者在这种情况下可以定义什么宏?
  • 恐怕我不知道,但一个快速的谷歌将我带到this mskb article,我不确定这是否会有所帮助。同样回到主要问题,_WIN64 和 _WIN32 宏可用于为 VS2008 中的 x86/x64 构建选择正确的库。
【解决方案2】:

您应该使用属性 -> 链接器 -> 附加包含目录为每个构建配置分支包含路径。这将解决您的问题。

次要选项是使用#pragma comment(lib,"<lib name>") 并使用要链接到的库的路径,然后使用#if/#endif 您可以基于当前构建版本进行分支。

您可以使用依赖遍历器、进程浏览器或任何调试器对其进行测试。

【讨论】:

  • 这个方法只有在添加到 VC++ 设置的第一个路径确实是正确的 .lib 文件的路径时才能正常工作?由于 .libs 都具有相同的文件名,VC++ 会不会只选择它涉及的第一个,而不管它是否正确?还是我低估了它的智能
  • @obmarg:我误读了他的帖子,尽管他编辑了 per build 设置,并对其进行了更改以反映我虽然他所做的...
【解决方案3】:

您应该将库目录添加到项目本身,而不是作为 Visual Studio 中的全局设置。

为此,您可以在解决方案资源管理器中右键单击该项目。然后在 VC++ 目录部分下,添加 assimp 的正确路径。您应该只将与当前(即调试或发布/win32 或 x64)设置对应的路径添加到此列表中。顶部应该有一个下拉菜单来选择您正在编辑的当前配置。

无论如何,这适用于 VS2010,我对 VS2008 不是 100% 确定。如果 VC++ 目录部分不存在,则库路径可能位于项目设置 -> 链接器 -> 常规 -> 附加库目录下。

【讨论】:

  • 如果我将路径添加到项目设置中,共享项目变得困难。我想我应该在这种情况下复制我的项目文件夹中的库和标题,对吧?
  • 这是处理它的一种方式。您还可以将所有外部库复制到单独的位置,然后使用环境变量或 .vsprops 文件中包含的属性来指定项目设置中的位置。然后任何其他用户只需要编辑 .vsprops 文件/将环境变量设置为外部库的位置。
  • 对于 .vsprops 选项,您可能希望在 MSDN 上阅读此内容:msdn.microsoft.com/en-us/library/a4xbdz1e%28v=VS.90%29.aspx 或此问题的一些链接和答案:stackoverflow.com/questions/2284265/…
  • 我也想过这个。在某些情况下,一种或另一种被认为是最佳做法或更合适吗?
  • 老实说,我不确定我是否最适合回答这个问题,可能是发布另一个问题的想法。我感觉使用属性表通常被认为是最佳实践,因为它不会使您的 PC 因过多的环境变量而杂乱无章,任何获取您的代码的人都会自动拥有一些默认值,并且它可能更加灵活。但我也经常看到用于此目的的环境变量,所以我想由您决定哪个最适合您的需求。
猜你喜欢
  • 2015-11-20
  • 1970-01-01
  • 2021-08-17
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 2019-09-10
相关资源
最近更新 更多