如何使用eigen编译C++程序而不指定-I标志?

Pau*_*scu 4 c++ g++ eigen eigen3

我有以下测试程序使用eigen:

#include <iostream>
#include <Eigen/Dense>

using namespace std;
using Eigen::MatrixXd;

int main() {
  MatrixXd m(2, 2);
  m(0, 0) = 3;
  m(1, 0) = 2.5;
  m(0, 1) = -1;
  m(1, 1) = m(1, 0) + m(0, 1);
  cout << m << endl;
}
Run Code Online (Sandbox Code Playgroud)

我可以编译它g++ -I/usr/include/eigen3/ test1.cpp.

但是,如果我没有指定include标志,则编译命令不起作用.这对我来说似乎很奇怪,因为我认为/usr/include编译器会自动拾取任何标题(例如Boost标题,也位于其下/usr/include,工作完全正常,无需告诉编译器在哪里查找它们).我需要对特征设置进行哪些更改,因此我不必在编译命令中指定-I标志?

Mar*_*ayr 8

如果你更换

#include <Eigen/Dense>
Run Code Online (Sandbox Code Playgroud)

通过

#include <eigen3/Eigen/Dense>
Run Code Online (Sandbox Code Playgroud)

你的代码将编译.换句话说,问题是您包含<Eigen/Dense>目录中的内容/usr/include/eigen3,但编译器仅/usr/include默认搜索.

我建议使用包含标志,而不是包含<eigen3/Eigen/Dense>,因为这在分发,操作系统等方面更易于移植,并且通常,更容易为其他环境配置编译.Eigen3附带pkg-config文件,非常易于使用和携带.用.编译

g++ $(pkg-config --cflags eigen3) test1.cpp
Run Code Online (Sandbox Code Playgroud)

将在所有平台上运行,其中pkg-config可用,如果你想避免使用硬编码的包含路径,它可以替代你.

  • 我不建议在“eigen3/”前缀中包含“&lt;eigen3/Eigen/Dense&gt;”,因为不能保证 Eigen 安装在 eigen3 子文件夹中。这是包装商的责任。 (3认同)