Как скомпилировать программу на С++ с использованием собственного кода без указания флага -I?

У меня есть следующая тестовая программа, использующая 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;
}

и я могу скомпилировать его с помощью g++ -I/usr/include/eigen3/ test1.cpp.

Однако команда компиляции не работает, если я не укажу флаг включения. Это кажется мне странным, потому что я думал, что любые заголовки под /usr/include будут автоматически подобраны компилятором (например, заголовки Boost, также расположенные под /usr/include, прекрасно работают без указания компилятору, где их искать). Какие изменения мне нужно внести в собственную настройку, чтобы мне не нужно было указывать флаг -I в команде компиляции?


person Paul Baltescu    schedule 24.02.2014    source источник


Ответы (1)


Если вы замените

#include <Eigen/Dense>

by

#include <eigen3/Eigen/Dense>

ваш код будет скомпилирован. Другими словами, проблема в том, что вы включаете <Eigen/Dense>, который находится в каталоге /usr/include/eigen3, но компилятор по умолчанию ищет только в /usr/include.

Я бы порекомендовал использовать флаги включения вместо включения <eigen3/Eigen/Dense>, потому что это более переносимо между дистрибутивами, операционными системами и т. д. и, как правило, проще настроить компиляцию для других сред. Eigen3 поставляется с файлами pkg-config, которые очень просты в использовании и переносимы. Компиляция с

g++ $(pkg-config --cflags eigen3) test1.cpp

будет работать на всех платформах, где доступен pkg-config, и это отличная альтернатива для вас, если вы хотите избежать жестко заданных путей включения.

person Markus Mayr    schedule 24.02.2014
comment
Я бы не рекомендовал включать <eigen3/Eigen/Dense> с префиксом eigen3/, потому что нет гарантии, что Eigen установлен в подпапке eigen3. Это ответственность упаковщика. - person ggael; 24.02.2014