为什么我不能在同一个 MS VS 解决方案中的两个控制台应用程序中使用 C++ Eigen(header only lib)?

Why can't I use C++ Eigen (header only lib) in two console apps within the same MS VS solution?

我用两个控制台应用程序项目制作了一个 Microsoft 可视化解决方案。我可以在一个项目中使用 Eigen 库,只需在属性中声明它,如下所示:

$(ProjectDir)Eigen\eigen3;

我可以使用 "Eigen::Vector3d" 等库结构,没问题。 现在,当我尝试将 header-only lib 复制到第二个项目文件夹并尝试为第二个项目文件夹设置相同的 属性,并使用我遇到编译错误的结构时。

然后,当我不将 Eigen 文件夹复制到第二个文件夹中,而只是尝试从第二个文件夹中引用第一个文件夹时,我得到了另一组编译时错误。

$(SolutionDir)someproject1\Eigen\eigen3;

第二种情况的错误是这样的:

c:\users\alam syed\documents\someproject2.h(11): error C2653: 'Eigen': is not a class or namespace name

c:\users\alam syed\documents\someproject2.h(11): error C2065: 'Vector3f': undeclared identifier

c:\users\alam syed\documents\someproject2.h(11): error C2923: 'std::vector': 'Vector3f' is not a valid template type argument for parameter '_Ty'

c:\users\alam syed\documents\someproject2.h(11): error C2903: 'allocator': symbol is neither a class template nor a function template

c:\users\alam syed\documents\someproject2.h(11): error C3203: 'allocator': unspecialized class template can't be used as a template argument for template parameter '_Alloc', expected a real type

为什么在同一个解决方案中有两个项目试图在它们的项目文件夹中独立拥有自己的库是不行的?此外,为什么我不能将 Eigen 文件夹从一个引用到第一个?最后,我们如何绕过这个 quirk/by-design 问题?

我刚刚对此进行了测试,在一种解决方案中是可行的。

  • 创建了空解决方案
  • 添加了两个控制台项目
  • 将特征值 headers 从 zip 复制到两个项目中的每一个中
  • 在第一个项目文件夹中将它们重命名为 eigen1,在第二个项目文件夹中将它们重命名为 eigen2
  • 使用 eigen 文档中的教程代码在每个项目中创建了两个 .cpp 文件
  • 在第一个项目中将($ProjectDir)eigen1设置为"Additional Include Directories"并且 ($ProjectDir)eigen2在第二个项目
  • 检查构建的调试二进制文件是否引用了正确的特征 headers 嵌入式调试信息

如果您不重命名 eigen 文件夹,这甚至可以工作。

我只能想到您想要这样做而不是使用 common 的两个原因 目录方法:

  • 每个项目都使用不同版本的库,或者您想拥有 稍后此选项的灵活性
  • 您想使用自定义版本的 eigen(and/or 其他库)应用您的 自己的补丁