如何使用Objective-C ++中的Boost Graph Library?

时间:2014-01-15 01:22:17

标签: xcode macos boost objective-c++ boost-graph

试图弄清楚如何在Objective-C ++中使用BGL。有点不对劲。重现的步骤:

  1. 新的Cocoa应用程序项目。
  2. 将MyAppDelegate.m重命名为MyAppDelegate.mm
  3. #include <boost/shared_ptr.hpp>添加到MyAppDelegate.mm(工作正常,假设您的标题搜索路径设置正确。)
  4. #include <boost/graph/adjacency_list.hpp>添加到MyAppDelegate.mm
  5. boost/graph/adjacency_list.hpp传递包含的内容与Cocoa标头可传递导入的一些旧的Carbon标头发生冲突。这是我看到的输出(无论如何第一个错误的价值):

    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>,然后在MyAppDelegate.mm中包含#include <boost/graph/adjacency_list.hpp>之前<Cocoa/Cocoa.h>,则会编译,但这是次优/不合适的。< / p>

    我能做些简单的事情(理想情况是在前缀标题中,所以我不必在任何地方都这样做)使Cocoa标题和BGL标题和平共存吗?

1 个答案:

答案 0 :(得分:1)

在询问之前,应该用Google搜索 epsilon 更多时间。发布之后我发现this page,这解释了在包含Cocoa标题之前添加以下行将会起到作用:

#define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0

我曾尝试在我的个人MyAppDelegate.mm文件中执行此操作,但它不起作用,但这是因为前缀标题。