Конфликт между библиотеками Boost, OpenCV и Eigen? - PullRequest
8 голосов
/ 16 марта 2011

Мой вопрос в некоторой степени связан с Статическим связыванием библиотек Boost и OpenCV с Eclipse CDR. ошибки , тогда как я пытаюсь сделать немного больше, чем описано здесь: Как создать программу, которая может читать все изображения в папке, используя Boost и OpenCV? , а именно перемещаться по каталогу, используя Boost's библиотека файловой системы и некоторая обработка файлов изображений с помощью OpenCV.

Я скомпилировал файловую систему и другие библиотеки с MinGW и попытался запустить Boost 1.45, OpenCV 2.2 и Eigen2 с Eclipse CDT в 64-разрядной системе Windows 7. Библиотека файловой системы компилируется и запускается без проблем, если используется в проекте отдельно, но в сочетании с двумя другими библиотеками, указанными выше, я получаю следующие ошибки:

In file included from C:\boost_1_45_0/boost/filesystem/v3/path_traits.hpp:22:0, 
                 from C:\boost_1_45_0/boost/filesystem/v3/path.hpp:25, 
                 from C:\boost_1_45_0/boost/filesystem.hpp:32, 
                 from ..\src\ComputeNatScaleFunction.cpp:18: 
C:\boost_1_45_0/boost/type_traits/decay.hpp: In instantiation of 'boost::decay<cv::<anonymous enum> >': 
C:\cmake_binaries\include/opencv2/core/operations.hpp:766:23:   instantiated from here 
C:\boost_1_45_0/boost/type_traits/decay.hpp:28:66: error: 'cv::' is/uses anonymous type 
C:\boost_1_45_0/boost/type_traits/decay.hpp:28:66: error:   trying to instantiate 'template struct boost::remove_reference' 
C:\boost_1_45_0/boost/type_traits/decay.hpp:38:17: error: 'cv::' is/uses anonymous type 
C:\boost_1_45_0/boost/type_traits/decay.hpp:38:17: error:   trying to instantiate 'template struct boost::remove_reference' 
C:\boost_1_45_0/boost/type_traits/decay.hpp: In instantiation of 'boost::decay<cv::<anonymous enum> >': 
C:\cmake_binaries\include/opencv2/core/operations.hpp:917:21:   instantiated from here 
C:\boost_1_45_0/boost/type_traits/decay.hpp:28:66: error: 'cv::' is/uses anonymous type 
C:\boost_1_45_0/boost/type_traits/decay.hpp:28:66: error:   trying to instantiate 'template struct boost::remove_reference' 
C:\boost_1_45_0/boost/type_traits/decay.hpp:38:17: error: 'cv::' is/uses anonymous type 
C:\boost_1_45_0/boost/type_traits/decay.hpp:38:17: error:   trying to instantiate 'template struct boost::remove_reference' 
C:\boost_1_45_0/boost/type_traits/decay.hpp: In instantiation of 'boost::decay<Eigen::<anonymous enum> >': 
C:\Eigen2/Eigen/src/Core/GenericPacketMath.h:116:18:   instantiated from here 
C:\boost_1_45_0/boost/type_traits/decay.hpp:28:66: error: 'Eigen::' is/uses anonymous type 
C:\boost_1_45_0/boost/type_traits/decay.hpp:28:66: error:   trying to instantiate 'template struct boost::remove_reference' 
C:\boost_1_45_0/boost/type_traits/decay.hpp:38:17: error: 'Eigen::' is/uses anonymous type 
C:\boost_1_45_0/boost/type_traits/decay.hpp:38:17: error:   trying to instantiate 'template struct boost::remove_reference' 

и т.д..

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

1 Ответ

9 голосов
/ 27 марта 2011

Использование пространства имен boost :: filesystem перед включением Eigen приводит к сбою компилятора:

#include <boost/filesystem.hpp>
using namespace boost::filesystem;
#include <Eigen/Core>

не удается, но

#include <boost/filesystem.hpp>
#include <Eigen/Core>
using namespace boost::filesystem;

работает.

Причиназаключается в том, что если boost :: filesystem добавляется в глобальное пространство имен, это загрязняет его и приводит к тому, что некоторый код (здесь: eigen), который зависит от незагрязненного пространства имен, вызывает ошибки во время компиляции.В этом нет ничего странного.Обычно вы никогда не должны ставить строки «с помощью» до того, как ваши включения будут завершены.

...