Как написать make-файл для проекта C++, который использует Eigen, библиотеку шаблонов C++ для линейной алгебры?

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

<Eigen/Core>
<Eigen/Dense>
<Eigen/Eigen>

и так далее. На веб-странице Eigen упоминается, что для использования его функций мне не нужно собирать проект, тогда как я могу включить эти файлы в свой make-файл для сборки моего проекта. Мой пример файла main.c выглядит так. Может ли кто-нибудь показать мне, как написать make-файл makefile для этого файла -

#include <Eigen/Core>

// import most common Eigen types 
USING_PART_OF_NAMESPACE_EIGEN

int main(int, char *[])
{
  Matrix3f m3;
  m3 << 1, 2, 3, 4, 5, 6, 7, 8, 9;
  Matrix4f m4 = Matrix4f::Identity();
  Vector4i v4(1, 2, 3, 4);

  std::cout << "m3\n" << m3 << "\nm4:\n"
    << m4 << "\nv4:\n" << v4 << std::endl;
}

Помощь!


person HaggarTheHorrible    schedule 19.07.2010    source источник
comment
Как вы скомпилируете и свяжете его?   -  person Draco Ater    schedule 19.07.2010


Ответы (4)


Согласно веб-сайту Eigen, это библиотека только для заголовков.

Это означает, что его не с чем компилировать или связывать. Вместо этого, пока у вас есть файлы заголовков в стандартном месте (/usr/local/include на *nix/Mac), все, что вам нужно сделать, это добавить это место на этапе сборки препроцессора.

Предполагая, что вы используете *nix/Mac, и предполагая, что у вас все установлено в места по умолчанию (например, #include <Eigen/Core> ссылается на файл /usr/local/include/Eigen/Core), тогда СУПЕР простой make-файл будет выглядеть так:

main: main.cpp
    g++ -I /usr/local/include main.cpp -o main

Что говорит по-английски:

  • main зависит от main.cpp
  • to make main, use g++ to
    • compile main.cpp,
    • выходной файл main,
    • поиск в каталоге /usr/local/include каких-либо заголовков, о которых он не знает

ПРИМЕЧАНИЕ: перед строкой g++ есть ТАБУЛЯЦИЯ, а НЕ четыре пробела.

Надеюсь, это поможет.

person Austin Hyde    schedule 19.07.2010

У них это есть в документации.

g++ -I /path/to/eigen2/ my_program.cpp -o my_program 

There is no library to link to. 

Кажется, вам просто нужно добавить путь к файлу шаблона (заголовка) в ваши включаемые каталоги внутри вашего Makefile.

person DumbCoder    schedule 19.07.2010

На самом деле это заголовочные файлы. Eigen — это библиотека шаблонов, и, следуя общепринятой практике использования шаблонов, все определения и объявления содержатся в файлах заголовков, в отличие от нестандартной практики хранения определений и объявлений в отдельных файлах. Когда замедления и определения хранятся отдельно, вы должны собрать исходные файлы, содержащие определения, в библиотечные объектные файлы, чтобы связать их с вашей программой.

Это уже якобы сделано для вас просто путем включения файлов заголовков Eigen в первую очередь.

Пока вы установили заголовочные файлы Eigen в свою систему, они будут скомпилированы в вашу программу без какой-либо настройки с вашей стороны. Если вы не установили их в свой путь включения, просто укажите полный путь к g++, например...

g++ -I /path/to/eigen2/ source_file -o output_file
person Eli    schedule 19.07.2010

Если вам нужна библиотека фортрана, вот команда, которую я использую

g++ source.cpp -o output -I/../include -L/../lib -L/../lib64 -lcholmod -lmetis -lamd -lcamd -lccolamd -lcolamd -llapack -lgfortran -lblas

Я заменяю фактический путь на ..

person Xatan    schedule 18.06.2011