Несколько определений при включении Eigen - PullRequest
0 голосов
/ 30 апреля 2018

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

Работает:

// File common1.hpp
#include <Eigen/Dense>
// File common2.hpp
#include "common1.hpp"
// File main.cpp
#include "common2.hpp"

clang++ main.cpp компилируется с этим.

Не работает:

// File common1.hpp
#include <Eigen/Dense>
// File common2.hpp
#include "common1.hpp"
// File common2.cpp
#include "common2.hpp"
// File main.cpp
#include "common2.hpp"

clang++ main.cpp common2.cpp завершается с ошибкой:

/tmp/common2-f75caf.o: In function `bool Eigen::numext::equal_strict<double, double>(double const&, double const&)':
common2.cpp:(.text+0x30): multiple definition of `bool Eigen::numext::equal_strict<double, double>(double const&, double const&)'
/tmp/main-8e7100.o:main.cpp:(.text+0x30): first defined here
/tmp/common2-f75caf.o: In function `bool Eigen::numext::equal_strict<float, float>(float const&, float const&)':
common2.cpp:(.text+0x0): multiple definition of `bool Eigen::numext::equal_strict<float, float>(float const&, float const&)'
/tmp/main-8e7100.o:main.cpp:(.text+0x0): first defined here
/tmp/common2-f75caf.o: In function `bool Eigen::numext::not_equal_strict<double, double>(double const&, double const&)':
common2.cpp:(.text+0x90): multiple definition of `bool Eigen::numext::not_equal_strict<double, double>(double const&, double const&)'
/tmp/main-8e7100.o:main.cpp:(.text+0x90): first defined here
/tmp/common2-f75caf.o: In function `bool Eigen::numext::not_equal_strict<float, float>(float const&, float const&)':
common2.cpp:(.text+0x60): multiple definition of `bool Eigen::numext::not_equal_strict<float, float>(float const&, float const&)'
/tmp/main-8e7100.o:main.cpp:(.text+0x60): first defined here
clang-7.0: error: linker command failed with exit code 1 (use -v to see invocation)

Мне действительно нравится Eigen C ++ API, и я бы очень хотел продолжать его использовать. Я посмотрел на несколько проектов, которые используют Eigen, и они делают второй блок кода, используя свои собственные пространства имен. Я попробовал это, но получил ту же ошибку. Любая помощь будет оценена.

Edit: Clang версия 7. Эйген: вытащил из зеркала Github в прошлом месяце или около того.

1 Ответ

0 голосов
/ 01 мая 2018

Это были результаты https://github.com/eigenteam/eigen-git-mirror/commit/11a3c93ee327dd2be34bc56bc04a5ebcb3340256, где соответствующие функции в ошибке еще не были встроены.

Как правило, это можно исправить с помощью последней версии Eigen (3.3.4 на момент написания этой статьи) или, более конкретно, с использованием кода на https://github.com/eigenteam/eigen-git-mirror/commit/37ca6e8ee578bf490b04f4e977c4ecb081d35e9f

или после него.

В Bitbucket 37ca6e равен https://bitbucket.org/eigen/eigen/commits/1f08827edccbe08648146cc584fcbd7f4bfb3e33

Оба теста теперь работают, спасибо всем, кто помог найти / исправить это.

...