2014-01-15 2 views
1

Попытка выяснить, как использовать BGL из Objective-C++. Что-то не так. Способы воспроизведения:Как использовать библиотеку Boost Graph из Objective-C++?

  1. Новый проект по применению какао.
  2. Rename MyAppDelegate.m в MyAppDelegate.mm
  3. Добавить #include <boost/shared_ptr.hpp> в MyAppDelegate.mm (отлично работает, предполагая, что у вас есть свой заголовок пути поиска установлен правильно.)
  4. Добавить #include <boost/graph/adjacency_list.hpp> в MyAppDelegate.mm

Что-то транзитивно включаемое boost/graph/adjacency_list.hpp сталкивается с некоторыми старыми заголовками углерода, которые транзитно импортируются заголовками Cocoa. Вот выход я вижу (стоит первой ошибки в любом случае):

In file included from /Users/me/Documents/Projects/BoostTest/BoostTest/MyAppDelegate.mm:10: 
In file included from /Users/me/Documents/Projects/BoostTest/boost/graph/adjacency_list.hpp:33: 
In file included from /Users/me/Documents/Projects/BoostTest/boost/graph/graph_traits.hpp:27: 
In file included from /Users/me/Documents/Projects/BoostTest/boost/pending/property.hpp:13: 
In file included from /Users/me/Documents/Projects/BoostTest/boost/type_traits.hpp:35: 
In file included from /Users/me/Documents/Projects/BoostTest/boost/type_traits/has_operator.hpp:12: 
In file included from /Users/me/Documents/Projects/BoostTest/boost/type_traits/has_bit_and.hpp:43: 
/Users/me/Documents/Projects/BoostTest/boost/type_traits/detail/has_binary_operator.hpp:154:42: error: expected member name or ';' after declaration specifiers 
    static ::boost::type_traits::yes_type check(has_operator); // this version is preferred when operator exists 
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
In file included from /Users/me/Documents/Projects/BoostTest/BoostTest/MyAppDelegate.mm:9: 
In file included from /Users/me/Documents/Projects/BoostTest/BoostTest/MyAppDelegate.h:9: 
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/Cocoa.framework/Headers/Cocoa.h:12: 
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:76: 
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSURLError.h:12: 
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/CoreServices.framework/Headers/CoreServices.h:23: 
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/AE.framework/Headers/AE.h:20: 
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Headers/CarbonCore.h:115: 
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Headers/Debugging.h:212: 
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/AssertMacros.h:1291:28: note: expanded from macro 'check' 
     #define check(assertion) __Check(assertion) 
           ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/AssertMacros.h:280:5: note: expanded from macro '__Check' 
        do                  \ 
       ^

Если удалить #import <Cocoa/Cocoa.h> из заголовка приставки проекта, а затем #include <boost/graph/adjacency_list.hpp> перед включением <Cocoa/Cocoa.h> в MyAppDelegate.mm вещей компилируются, но это подкаталог -оптимальным/нежелательно.

Есть ли что-то простое, что я могу сделать (идеально в заголовке префикса, поэтому мне не нужно делать это везде), чтобы заголовки какао и заголовки BGL сосуществовали мирно?

ответ

1

Должно иметь googled для epsilon больше времени перед запросом. Сразу после размещения этого я нашел this page, который объясняет, что добавив следующую строку перед включением заголовков какао будет делать трюк:

#define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0 

Я пытался сделать это в моем отдельном файле MyAppDelegate.mm, и он не сделал работа, но это было из-за заголовка префикса. Добавление его в заголовок префикса проекта до его включения Cocoa/Cocoa.h сделало трюк.

Смежные вопросы