Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 导入前对框架进行条件编译检查_Objective C_C_Ios_Conditional - Fatal编程技术网

Objective c 导入前对框架进行条件编译检查

Objective c 导入前对框架进行条件编译检查,objective-c,c,ios,conditional,Objective C,C,Ios,Conditional,在导入和使用框架之前,我正在寻找一种方法来检查框架是否存在和/或是否定义了它的类。具体来说,该框架是资产库 目前,我可以通过核心数据框架来实现这一点,因为该框架有一个名为CoreDataDefines.h的文件,该文件提供了一个预处理器指令_CoreDataDefines_h。这允许我简单地检查该定义,如下所示: #ifdef _COREDATADEFINES_H #import <CoreData/CoreData.h> // do something with Core Dat


在导入和使用框架之前,我正在寻找一种方法来检查框架是否存在和/或是否定义了它的类。具体来说,该框架是资产库

目前,我可以通过核心数据框架来实现这一点,因为该框架有一个名为CoreDataDefines.h的文件,该文件提供了一个预处理器指令_CoreDataDefines_h。这允许我简单地检查该定义,如下所示:

#ifdef _COREDATADEFINES_H
#import <CoreData/CoreData.h>

// do something with Core Data

#else

// do something without using Core Data

#endif
\ifdef\u COREDATADEFINES\u H
#进口
//对核心数据做些什么
#否则
//做一些不使用核心数据的事情
#恩迪夫

不幸的是,资产库没有提供清晰的定义头文件,因此我正在寻找一种方法来编写自己的#define语句,以便在导入框架之前检查框架是否存在,就像我在上面对核心数据所做的那样

我试过这个:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000
// import assets library if defined !
#define ASSETSLIBRARY_DEFINE    (NSClassFromString(@"ALAsset") != nil)
#if ASSETSLIBRARY_DEFINE
#import <AssetsLibrary/AssetsLibrary.h>
#endif
#endif
#如果允许IPHONE操作系统版本>=40000
//导入资源库(如果已定义)!
#定义资产库\u定义(NSClassFromString(@“ALAsset”)!=nil)
#如果资产库定义
#进口
#恩迪夫
#恩迪夫
。。。但是没有运气。
编译器告诉我“标记不是预处理器子表达式中的有效二进制运算符。”



非常感谢您提供的任何帮助。

如果您知道应该随框架导入哪个类,您可以检查它是否已加载:

BOOL isFrameworkLoaded = (NSClassFromString(@"MyClassNameFromTheFramework") != nil);

你在这里做的是非常错误的。您在COREDATADEFINES.H中看到的
\u COREDATADEFINES\u H
定义称为sentinal值,这是一种古老的C技术,用于避免同一头文件中包含多个内容

当然,您不应该在自己的代码中使用它,sentinal的出现只会告诉您头已经包含在其他地方。如果没有定义sentinal,它只是意味着没有包含头,而不是框架本身不存在

我不确定您到底想做什么,但看起来您希望使用宏来决定使用框架的代码和不使用框架的代码。如果要在编译时执行此操作,唯一的选择是定义自己的宏,并使用一些编译器选项在目标中设置它们。例如,要启用使用资产库的代码,可以在“其他C标志”生成设置中定义:

-DUSE_ASSETS_FRAMEWORK
然后在代码中使用此选项:

#ifdef USE_ASSETS_FRAMEWORK
    #import <AssetsLibrary/AssetsLibrary.h>
    // code that uses assets framework
#else
    // code that does not use assets framework
#endif

对于这类事情,我有一些技巧…虽然下面的内容可能无法完全解决您详细描述的问题,但这可能有助于找到最终解决方案…第一个“策略”可以在“脚本构建阶段”调用。这可以在许多方面使用,但在本例中,它测试框架是否有效(根据
otool
),然后相应地进行一些“后处理”,然后再次测试,依此类推

function test { "$@";   status=$?;
    if [ $status -ne 0 ]; then
       echo "error with $1"; fi 
    return $status
}
  PRODUCT_PATH="${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}"
        BINARY="$PRODUCT_PATH/${PRODUCT_NAME}"
           MAC="/Library/Frameworks/"
SYSTEM_PRODUCT="$MAC/${WRAPPER_NAME}"

test otool -l "$BINARY" #/Library/Frameworks/AtoZ.framework/AtoZ
if [ $status -ne 0 ]; then
   sudo rm -r "$SYSTEM_PRODUCT"
   sudo cp -r "$PRODUCT_PATH" "$SYSTEM_PRODUCT"
test otool -l "$BINARY" 
if [ $status == 0 ]; then
   cd "${PRODUCT_PATH}"
   ln -sF Versions/Current/Frameworks Frameworks
fi
下一个在这个智慧中为所有人免费的是性感的,并且恰当地命名为
NSBundle
method..
preflightAndReturnError


不过,很有可能……当加载完成时,您将……
OK DOK

您考虑过使用吗?它可以检查现有的Mac OS X框架。我不知道如何查找iOS框架,但作为最后的手段,您可以编写自己的cmake模块来查找它。这方面有很大的问题。谢谢您的帮助他是info@Maciek,但我认为CMake不是我要找的。基本上,我只需要一个预处理器指令,检查项目包的框架中是否存在头文件。在哪里可以找到解决方案?感谢信息Mike。我正在尝试创建一个跨项目框架,当某个框架出现时,它可以自动省略代码k还没有被导入。这就是我所说的“不存在”的意思……也就是说,在当前使用我的框架的项目中不存在。因此,如果可能的话,我不希望在每个项目中都设置宏。这就是我试图避免的。我也考虑了运行时建议,但它会产生编译时错误并阻止我运行g未检测到资产库框架时我的代码。
function test { "$@";   status=$?;
    if [ $status -ne 0 ]; then
       echo "error with $1"; fi 
    return $status
}
  PRODUCT_PATH="${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}"
        BINARY="$PRODUCT_PATH/${PRODUCT_NAME}"
           MAC="/Library/Frameworks/"
SYSTEM_PRODUCT="$MAC/${WRAPPER_NAME}"

test otool -l "$BINARY" #/Library/Frameworks/AtoZ.framework/AtoZ
if [ $status -ne 0 ]; then
   sudo rm -r "$SYSTEM_PRODUCT"
   sudo cp -r "$PRODUCT_PATH" "$SYSTEM_PRODUCT"
test otool -l "$BINARY" 
if [ $status == 0 ]; then
   cd "${PRODUCT_PATH}"
   ln -sF Versions/Current/Frameworks Frameworks
fi
NSBundle *b = [NSBundle bundleWithPath:path];
NSError *e  = nil;
BOOL okdok  = [b preflightAndReturnError:&e];
if  (okdok)  
     okdok  = [b load];
if (!okdok) { [self jumpOffABridge:nil]; goto hell; }