J'ai installé libeigen3-dev
afin de compiler des programmes en utilisant Eigen 3. lorsque j'inclus un fichier, tel que Eigen/Dense
J'obtiens cette erreur lorsque j'essaie d'exécuter g++
:
user@office-debian:~/Documents/prog$ g++ src/main.cpp -MMD -std=c++11
In file included from src/main.cpp:9:0:
src/tdefs.h:16:23: fatal error: Eigen/Dense: No such file or directory
compilation terminated.
L'exécution de la ligne suivante fonctionne correctement:
g ++ -I/usr/include/eigen3/src/main.cpp -MMD -std = c ++ 11
ce répertoire d'inclusion ne devrait-il pas être trouvé automatiquement par GCC parce que j'ai installé le paquet Eigen via aptitude? Pourquoi boost et OpenGL sont-ils trouvés automatiquement lorsque j'installe les bibliothèques mais pas Eigen? (Notez que eigen est une bibliothèque uniquement en-tête, mais cela ne devrait pas avoir d'importance?)
Fonctionnement g++ src/main.cpp -MMD -std=c++11 --verbose
produit la sortie suivante:
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.7/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.7.2-5' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --with-Arch-32=i586 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --Host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.7.2 (Debian 4.7.2-5)
COLLECT_GCC_OPTIONS='-MMD' '-std=c++11' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-linux-gnu/4.7/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -MMD main.d -D_GNU_SOURCE src/main.cpp -quiet -dumpbase main.cpp -mtune=generic -march=x86-64 -auxbase main -std=c++11 -version -o /tmp/ccoYRPKY.s
GNU C++ (Debian 4.7.2-5) version 4.7.2 (x86_64-linux-gnu)
compiled by GNU C version 4.7.2, GMP version 5.0.5, MPFR version 3.1.0-p10, MPC version 0.9
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/include/c++/4.7
/usr/include/c++/4.7/x86_64-linux-gnu
/usr/include/c++/4.7/backward
/usr/lib/gcc/x86_64-linux-gnu/4.7/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
GNU C++ (Debian 4.7.2-5) version 4.7.2 (x86_64-linux-gnu)
compiled by GNU C version 4.7.2, GMP version 5.0.5, MPFR version 3.1.0-p10, MPC version 0.9
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 66d178dd81da8c975e003e06d9f5e782
In file included from src/main.cpp:9:0:
src/tdefs.h:16:23: fatal error: Eigen/Dense: No such file or directory
compilation terminated.
Exécutez votre compilateur avec le --verbose
commutateur:
g++ --verbose ...
Si vos inclusions sont relatives à l'un des chemins indiqués dans cette sortie, vous n'avez pas besoin d'utiliser -I
. Cela dépend de la façon dont gcc a été configuré, et cela dépend de l'endroit où ces autres éléments sont installés.
Notez que .
n'est généralement pas dans les chemins -I.
Plus tard
Après avoir échangé quelques commentaires, il est clair que /usr/include/eigen3/Eigen/Dense
devrait être inclus par #include <Eigen/Dense>
, mais pas par #include <eigen3/Eigen/Dense>
. Par conséquent, l'ajout de l'option de ligne de commande -I /usr/include/eigen3
est obligatoire.
Si une installation choisit d'installer des fichiers d'en-tête dans un répertoire qui, dans l'un de ceux compilés dans gcc, dépend de la valeur par défaut, d'une décision prise par le distributeur ou d'une décision prise lors de l'installation. Je dirais que les fichiers d'en-tête "fréquemment utilisés" (Boost) sont bien placés dans/usr/local/include alors que certaines choses "élitistes" seraient mieux dans un répertoire qui lui est propre.
J'ai eu ce même problème sur ma boîte Ubuntu 14. J'ai fini par créer des liens symboliques pour le contourner. Avec eigen3 installé dans/usr/local/include, procédez comme suit:
cd /usr/local/include
Sudo ln -sf eigen3/Eigen Eigen
Sudo ln -sf eigen3/unsupported unsupported
Vous devriez maintenant pouvoir inclure les en-têtes en:
#include <Eigen/Dense>
#include <unsupported/Eigen/FFT>
Changement
#include <Eigen/Dense>
à
#include <eigen3/Eigen/Dense>
Devrait utiliser ce qui suit:
#if defined __GNUC__ || defined __Apple__
#include <Eigen/Dense>
#else
#include <eigen3/Eigen/Dense>
#endif
Cela a fonctionné pour moi (en utilisant Macports pour installer Shogun sur Mac OS 10.11):
cd ${macports_prefix}/include
Sudo ln -sf eigen3/Eigen Eigen
Sudo ln -sf eigen3/unsupported unsupported