2011-06-24 98 views
0

我有一個包含OpenFeint作爲依賴項的Xcode項目。 OpenFeint有一個類可以撥打Block_copy()兩個電話,一個撥打Block_release()。一切都很好(就像我在構建和運行這個項目時一樣,沒有發生任何事情),直到編譯器突然開始抱怨說這些函數不存在。這個東西在兩個版本之間真正打破了,沒有修改源代碼。Block_copy失蹤

我不知道在哪裏,這些功能可能已經走了,但我已經試圖通過提供一些佔位符函數原型,像這樣來解決它:

extern void* Block_copy(const void *aBlock); 
extern void Block_release(const void *aBlock); 

我不知道如果這些都是正確的簽名(關於這個主題的文檔最好是稀疏的),但它是我能找到的最接近的。可悲的是,這只是導致鏈接器抱怨而不是編譯器。

那麼有什麼想法?我的整個開發環境是否被擰緊?如果不是,我如何再次使用它?

回答

0

臨時解決方法是在OpenFeint源文件中內嵌'Block.h'的全部內容。奇怪的是,試圖#include#import該文件不起作用,這可能是整個問題。

在任何情況下,這個文件應該在/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator[VERSION].sdk/usr/include/Block.h存在,其內容應該是:

#ifndef _Block_H_ 
#define _Block_H_ 

#if !defined(BLOCK_EXPORT) 
# if defined(__cplusplus) 
#  define BLOCK_EXPORT extern "C" 
# else 
#  define BLOCK_EXPORT extern 
# endif 
#endif 

#include <Availability.h> 
#include <TargetConditionals.h> 

#if __cplusplus 
extern "C" { 
#endif 

    // Create a heap based copy of a Block or simply add a reference to an existing one. 
    // This must be paired with Block_release to recover memory, even when running 
    // under Objective-C Garbage Collection. 
    BLOCK_EXPORT void *_Block_copy(const void *aBlock) 
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); 

    // Lose the reference, and if heap based and last reference, recover the memory 
    BLOCK_EXPORT void _Block_release(const void *aBlock) 
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); 


    // Used by the compiler. Do not call this function yourself. 
    BLOCK_EXPORT void _Block_object_assign(void *, const void *, const int) 
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); 

    // Used by the compiler. Do not call this function yourself. 
    BLOCK_EXPORT void _Block_object_dispose(const void *, const int) 
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); 

    // Used by the compiler. Do not use these variables yourself. 
    BLOCK_EXPORT void * _NSConcreteGlobalBlock[32] 
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); 
    BLOCK_EXPORT void * _NSConcreteStackBlock[32] 
    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); 


#if __cplusplus 
} 
#endif 

// Type correct macros 

#define Block_copy(...) ((__typeof(__VA_ARGS__))_Block_copy((const void *)(__VA_ARGS__))) 
#define Block_release(...) _Block_release((const void *)(__VA_ARGS__)) 


#endif 
1

您是否切換XCode或iOS(暗示最近爲開發人員發佈的東西)。這可能是因爲,如果你意外切換到了ARC,那些功能可能不再存在(ARC不在NDA之下,因爲它已經存在並且是開源的)。

+0

不,沒有交換/升級任何東西。我正在使用iOS 4.3 SDK,它不包含ARC,是否正確? – aroth

+0

然後給我。我犯了升級到開發人員預覽的錯誤,我的代碼以幾乎相同的方式打破了(因此我的答案)。 – Jake

1

Block_copy的實際定義是 /Developer/SDKs/MacOSX10.6.sdk/usr/include/Block.h 並讀取 #define Block_copy(...) ((__typeof(__VA_ARGS__))_Block_copy((const void *)(__VA_ARGS__))) 和_Block_copy是在同一個文件由 BLOCK_EXPORT無效* _Block_copy定義(const void * aBlock);

提供您自己的定義將無助於Xcode。 XCode中的目標是否已更改?

+0

不,我所有的XCode設置似乎都很好。如果我評論這些違規行,應用程序就會毫無問題地構建和運行。不過,我擔心我可能在OpenFeint中做了些什麼。 – aroth