Xcode-使用内置库

713 阅读2分钟

1、将系统动态库导入Xcode

  • 将系统动态库拖入Xcode中时可能会报错:
    dyld[20219]: Library not loaded: 
        @rpath/DVTPortal.framework/Versions/A/DVTPortal
    
    • @rpath:framework在真机中的路径(真机中采用@rpath + framework中要调用的类的路径)
  • 解决方法:找到链接不到的framework所在路径,配置给Runpath Search Paths(多个framework找不到可能要添加多个路径) image.png
    // Config文件配置
    LD_RUNPATH_SEARCH_PATHS = "/Applications/Xcode.app/Contents/SharedFrameworks/" 
                            "/Applications/Xcode.app/Contents/Frameworks"
    

2、手动拖framework进工程

手动拖framework进工程时,系统自动配置两项内容:

  • framework search path:去哪个路径去搜索framework image.png
    FRAMEWORK_SEARCH_PATHS =  "/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/Frameworks"
    
  • ld -framework:使用Other Linker Flags告诉链接器要链接的framework名称 image.png
    // Xlinker后面接的参数是直接传给链接器的,而不是Clang了
    OTHER_LDFLAGS = -framework DevToolsCore -Xlinker -U -Xlinker _IDEInitialize
    
    • Xlinker:后面接的参数是直接传给链接器的,而非Clang了
    • -U:要求链接器不要检查后边的符号(例中为_IDEInitialize符号)

3、内置库使用

  1. 内置库本身未提供头文件,因此需要网上找大神弄好的头文件,这样才能调用Api image.png

  2. 文件直接导进去,可能因为路径问题会产生找不到的情况,因此可以选择不导入文件夹,而是直接在Config文件中配置 image.png

  3. 配置Header Search Paths,让工程能按路径找到这些头文件(注意如果在Build Settings中手动改了会影响Config文件生效image.png

    // 放到了工程目录下的LZMod文件夹下
    HEADER_SEARCH_PATHS = "${SRCROOT}/LZMod"
    
  4. 在编写功能代码(模拟将文件拖入工程)

    #import <Foundation/Foundation.h>
    #import "PBXProject.h"
    #import "PBXFileReference.h"
    #import "PBXGroup.h"
    
    BOOL IDEInitialize(int, NSError **error);
    
    int main(int argc, const char * argv[]) {
        NSError *error;
        BOOL initialized = IDEInitialize(1, &error);
    
        PBXProject *project = [PBXProject projectWithFile:@"/Volumes/Disk_D/test code/LZMod/LZMod.xcodeproj"];
        PBXFileReference *re = [project fileReferenceForPath:@"要添加进工程的文件路径"];
        if (!re) {
            [[project rootGroup] addFiles:@[@"要添加进工程的文件路径"] copy:NO createGroupsRecursively:NO];
        }
        [project writeToFileSystemProjectFile:YES userFile:NO checkNeedsRevert:NO];
        return 0;
    }
    

    image.png