使用类库的关键 - ShenYj/ShenYj.github.io GitHub Wiki

使用类库的关键

  • 静态库

    通过探索 静态库 得知使用类库的三要素:

    1. 头文件路径
    2. 库文件路径
    3. 库文件名称
    // 1. -I: 头文件
    HEADER_SEARCH_PATHS = $(inherited) "${SRCROOT}/AFNetworking" "${SRCROOT}/AFNetworking2"
    // 2. -L: library 所在目录
    LIBRARY_SEARCH_PATHS = $(inherited) "${SRCROOT}/AFNetworking" "${SRCROOT}/AFNetworking2"
    // 3. -l 名称
    OTHER_LDFLAGS = $(inherited) -l "AFNetworking" -l "AFNetworking2"
  • 动态库

    通过探索 动态库 得知使用动态库的基本四要素:

    1. 头文件路径
    2. 库文件路径
    3. 库文件名称
    4. 配置 run path
    // 1. -I: 头文件
    HEADER_SEARCH_PATHS = $(inherited) ${SRCROOT}/DashLine.framework/Headers
    // 2. -F: framework 所在目录
    FRAMEWORK_SEARCH_PATHS = $(inherited) ${SRCROOT}
    // 3. framework 名称
    OTHER_LDFLAGS = $(inherited) -framework "DashLine"
    // 4. 动态库的路径 
    LD_RUNPATH_SEARCH_PATHS = $(inherited) ${SRCROOT}

对于静态库和动态库, clang 对应的参数略微不同, 在不考虑弱引用等复杂实现的场景下, 想要保证一个动态库或静态库的正常使用,这些配置必不可少

  • clang 关键参数说明

    -x: 指定编译文件语言类型
    -target: 指定指令集(-target arm64-apple-ios14.3 真机)
    -g: 生成调试信息
    -c: 生成目标文件,只运行preprocess,compile,assemble,不链接
    -o: 输出文件
    -isysroot: 使用的SDK路径
        1. -I<directory> 在指定目录寻找头文件 (header search path)
        2. -L<dir> 指定库文件路径(.a\.dylib库文件) (library search path)
        3. -l<library_name> 指定链接的库文件名称(.a\.dylib库文件)(other link flags -lAFNetworking)  
        4. -F<directory> 在指定目录寻找framework (framework search path)
        5. -framework <framework_name> 指定链接的framework名称 (other link flags -framework AFNetworking)  
⚠️ **GitHub.com Fallback** ⚠️