Предварительно скомпилированные заголовки Eigen

У меня есть простой заголовочный файл (VectorSpace.h), который включает библиотеку Eigen, векторный класс и функцию-член:

#include <Eigen/Eigen>
#include <string>

class vector {
public:
  Eigen::Matrix<double,1,Eigen::Dynamic> vec;

double dot(const vector &that){
    return (this->vec).dot(that.vec);
}
};

Я пытался предварительно скомпилировать этот заголовок, используя g++

g++ -std=c++11 -I../userlib/eigen VectorSpace.h

который генерирует VectorSpace.h.gch, но когда я пытаюсь скомпилировать основной код (который в основном является пустым main()):

g++ -std=c++11 -include VectorSpace.h code.o -o code

Я получаю следующую ошибку:

../userlib/eigen/Eigen/src/Core/DenseCoeffsBase.h:56:30: warning: ignoring attributes on template argument ‘Eigen::internal::packet_traits<double>::type’ {aka ‘__vector(2) double’} [-Wignored-attributes]
../userlib/eigen/Eigen/src/Core/DenseCoeffsBase.h: In instantiation of ‘class Eigen::DenseCoeffsBase<Eigen::Product<Eigen::Block<Eigen::Matrix<double, -1, -1>, -1, -1, true>, Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1>, -1, 1, true>, -1, 1, false>, 0>, 0>’:
../userlib/eigen/Eigen/src/Core/DenseBase.h:41:34:   required from ‘class Eigen::DenseBase<Eigen::Product<Eigen::Block<Eigen::Matrix<double, -1, -1>, -1, -1, true>, Eigen::Block<Eigen::Block<Eigen::Matrix<double, -1, -1>, -1, 1, true>, -1, 1, false>, 0> >’

Я делаю что-то не так или это потому, что Eigen не может быть предварительно скомпилирован? (У меня нет проблем с предварительной компиляцией заголовков стандартной библиотеки, просто когда я добавляю Eigen, я получаю сообщение об ошибке)


person Ramin    schedule 29.07.2020    source источник


Ответы (1)


$ g++ -std=c++11 -I../userlib/eigen VectorSpace.h
$ g++ eigen.cpp -I ../userlib/eigen -include VectorSpace.h -H -o eigen

где eigen.cpp — исходный файл, содержащий точку входа main().

int main()
{
  vector v;
  return 0;
}
person OS2    schedule 29.07.2020
comment
Предыдущая ошибка была решена, когда я сбросил -std=c++11. Это почему? Но теперь, когда я использую флаг -H, он дает мне x VectoSpace.h.gch, поэтому он не использует предварительно скомпилированный файл. - person Ramin; 29.07.2020
comment
Я включил флаг -include, но gch по-прежнему не использовался (я проверил еще раз, все еще x Vectorspace.h.gch). Интересно, работает ли он в вашей системе, если у вас есть eigen. У меня ровно то, что написано выше для VectorSpace.h и eigen.cpp. - person Ramin; 30.07.2020
comment
когда я удалил -std=c++11 , он не смог использовать предварительно скомпилированный заголовок, поэтому ошибка изменилась. Ошибка есть, когда она есть! Vectorspace.h.gch, значит, он его использует. Я думаю, я не могу предварительно скомпилировать eigen - person Ramin; 30.07.2020
comment
Казалось бы, вы должны установить флаг -std при сборке. Если вы сделаете -std=c++98, он все равно будет работать. - person OS2; 30.07.2020