#include <iostream>
#include<eigen3/Eigen/src/Core/Matrix.h> // does not define Eigen::StorageOptions
// need something like this
#include<eigen3/Eigen/src/ everything_in_here >
int main()
{
Eigen::Matrix<double,2,2> mat;
std::cout << mat(0,0) <<std::endl;
return 0;
}
Там я пытаюсь создать матричный объект, и он всегда запрашивает 6 параметров шаблона с сообщением об ошибке:
неправильное количество аргументов шаблона (3, должно быть 6)
Поэтому я начал добавлять их, 4-й — Eigen::StorageOptions
и не определен в заголовке Matrix.h
. Также слишком много заголовков для поиска. Итак, могу ли я включить туда все файлы одним #include
?
В идеале в C++20 мы должны написать import eigen3;
, чтобы просто и эффективно импортировать все заголовочные файлы.
включает от /src/
? Eigen/Dense
уже должен быть тем заголовком, который вы ищете
Хотя новички обычно стараются избегать этого (поэтому регулярно обращаются за советом о том, как включить сразу большое количество заголовков), обычно считается лучшей практикой включать только те заголовки, которые необходимы для каждого исходного файла. Это уменьшает зависимости, а также сокращает время инкрементной сборки (например, когда редактируются некоторые заголовки, нет необходимости перекомпилировать/пересобирать весь проект, что в больших проектах может сэкономить огромное количество времени в ожидании завершения сборки).
Нет, нет. Могут быть включены только отдельные файлы. (Хотя технически то, что это означает, определяется реализацией.) Препроцессор не имеет концепции файловой системы/каталога. Он рассматривает имена файлов, используемые в директивах #include
, только как строки, а не пути.
Я также не знаю ни одного расширения компилятора для поддержки этого (хотя они могут быть).
Вы можете сгенерировать необходимые директивы #include
в скрипте в качестве подготовительного шага в процессе сборки.
Можно ли использовать #include
во время выполнения после поиска файлов в программе?
@huseyintugrulbuyukisik Нет.
@huseyintugrulbuyukisik Вы можете написать сценарий на любом языке, чтобы добавить его в качестве подготовительного этапа в систему сборки. Он может сканировать каталог и записывать строки #include
в файл заголовка, который затем можно включить.
Потому что это статическая компиляция, верно? Затем мне нужно создать строку кода C++ и скомпилировать ее во время выполнения со всеми перечисленными заголовками файлов.
@huseyintugrulbuyukisik Это возможно, но, вероятно, гораздо больше работы, чем добавление, например. скрипт Python для системы сборки.
На самом деле у eigen
уже есть список заголовков под названием Dense
, но используемая мной IDE не находит его автоматически, поэтому мне пришлось написать его самому. Но было интересно, есть ли С++-способ сделать то же самое.
@huseyintugrulbuyukisik Если у вас есть конкретная проблема с вашей IDE, вы должны описать эту реальную проблему (в новом вопросе).
Вы не должны включать что-либо непосредственно из Eigen/src/...
. Если вам нужны только основные компоненты Eigen, используйте
#include <Eigen/Core>
Если вы хотите включить все, что связано с плотными матричными операциями (например, разложением и модулем геометрии):
#include <Eigen/Dense>
Если вы также хотите включить модуль Sparse
#include <Eigen/Sparse>
// or this to include Dense+Sparse:
#include <Eigen/Eigen>
Вы должны убедиться с помощью параметров компиляции, что каталог Eigen верхнего уровня находится в вашем пути включения, например. во многих средах Linux добавьте -I/usr/include/eigen3
в качестве аргумента. Ваша IDE, вероятно, также имеет возможность для этого. Если вы используете что-то вроде CMake, для этого возникает множество связанных вопросов.
Если по какой-либо причине это не работает или вам просто нужен быстрый и грязный обходной путь, вы можете написать
#include <eigen3/Eigen/Core> //etc
Да, это путь. Просто интересно, есть ли в С++ ярлык для включения множества заголовков.
Нет, но вы всегда можете создать заголовочный файл, который сделает это за вас (хотя это может быть не очень эффективно, обычно включает только то, что вы используете)