【问题标题】:Compile PJSIP 2.5 Library for all architectures为所有架构编译 PJSIP 2.5 库
【发布时间】:2016-10-25 06:24:38
【问题描述】:

要为 iPhone 设备编译 PJSIP 库,我正在使用此代码

make distclean && make clean
ARCH='-arch arm64' ./configure-iphone --enable-opus-codec
make dep
make

此代码仅允许我为单一架构安装我的应用程序。 要为所有架构(armv7、armv7s、arm64、i386、x86_64)编译 pjsip,我可以使用哪个命令或工具

【问题讨论】:

    标签: ios makefile build voip pjsip


    【解决方案1】:
    --- One Way to build PJSIP libraries --- test with pjsip 2.6
    
    //Updated for XCode 8. 
    
    Building PJSIP
    $ cd /Users/ravimalviya/Developer/Dev2/trunk
    
    //If you want to specify the minimum supported iOS version
    //export MIN_IOS="-miphoneos-version-min=8.0"
    
    Compile Library and Build For Default iPhone 4 use armv7 architecture
    $ ./configure-iphone && make dep && make clean && make
    
    Build For iPhone 5, use armv7s architecture
    $ ARCH='-arch armv7s' ./configure-iphone && make dep && make clean && make
    
    Build For iPhone 5s, use arm64 architecture
    $ ARCH='-arch arm64' ./configure-iphone && make dep && make clean && make
    
    Build For Simulator, use i386 architecture
    export DEVPATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer
    ARCH="-arch i386" CFLAGS="-O2 -m32 -mios-simulator-version-min=5.0" LDFLAGS="-O2 -m32 -mios-simulator-version-min=5.0" ./configure-iphone
    make dep && make clean && make
    
    Build For Simulator, use x86_64 architecture
    export DEVPATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer
    ARCH="-arch x86_64" CFLAGS="-O2 -m32 -mios-simulator-version-min=5.0" LDFLAGS="-O2 -m32 -mios-simulator-version-min=5.0" ./configure-iphone
    make dep && make clean && make
    
    The compilation result
    pjlib/lib       
    pjlib-util/lib
    pjmedia/lib
    pjsip/lib
    pjnath/lib
    third_party/lib
    Note add into project..
    
    Combine resulting archtecture(arm64,armv7,armv7s,i386, x86_64) supported library .a file.
    
    //goto directory where you collect all build library. create folder name arm64, armv7s, armv7, i386, x86_64 and put all library respectivly. each having only one arch supported library file.
    //rename file in all these 5 folders it's a easy way to make universal library.
    //Also create folder named unified where all unversal library will create.
    
    $ export LIB_NAME="libg7221codec.a"
    $ lipo -arch armv7 armv7/$LIB_NAME -arch armv7s armv7s/$LIB_NAME -arch arm64 arm64/$LIB_NAME -arch i386 i386/$LIB_NAME -arch x86_64 x86_64/$LIB_NAME -create -output unified/$LIB_NAME
    
    //-arch armv7s armv7s/$LIB_NAME means support armv7s get library from directory armv7s/$LIB_NAME and $LIB_NAME file name that only support armv7s.
    //-arch arm64 arm64/$LIB_NAME ............
    //-arch armv7 armv7/$LIB_NAME ............
    //-arch i386 i386/$LIB_NAME ..............
    //-arch x86_64 x86_64/$LIB_NAME ..............
    //unified/$LIB_NAME is directory where unversal library will build using lips. with same name $LIB_NAME that export. do it same.
    
    //check which arch you lib is supporting
    xcrun -sdk iphoneos lipo -info unified/$LIB_NAME
    
    $ export LIB_NAME="libgsmcodec.a"
    $ lipo -arch armv7 armv7/$LIB_NAME -arch armv7s armv7s/$LIB_NAME -arch arm64 arm64/$LIB_NAME -arch i386 i386/$LIB_NAME -arch x86_64 x86_64/$LIB_NAME -create -output unified/$LIB_NAME
    $ export LIB_NAME="libilbccodec.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libpj.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libpjlib-util.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libpjmedia-audiodev.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libpjmedia-codec.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libpjmedia-videodev.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libpjmedia.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libpjnath.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libpjsdp.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libpjsip-simple.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libpjsip-ua.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libpjsip.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libpjsua.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libpjsua.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libpjsua2.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libresample.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libspeex.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libsrtp.a"
    $ .....same as above in lipo......
    $ export LIB_NAME="libyuv.a"
    $ lipo -arch armv7 armv7/$LIB_NAME -arch armv7s armv7s/$LIB_NAME -arch arm64 arm64/$LIB_NAME -arch i386 i386/$LIB_NAME -arch x86_64 x86_64/$LIB_NAME -create -output unified/$LIB_NAME
    
    Note: Unversal libraries you can add into your project and also mention in library search path.
    
    //In order to use the pjsip libraries, we need to include folder that ahve header files that access .a files. Naturally, the header files are located in:
    pjlib/include
    pjlib-util/include
    pjmedia/include
    pjnath/include
    pjsip/include
    
    Note: do't add into project..buz you can not import like import <pjsip-lib/pjsip.h>
    so just place these folder into project directory where ever you want but mention in header search path.
    
    Enjoy (:)
    

    【讨论】:

    • 很好的解释真的很赞
    【解决方案2】:

    为所有设备编译的步骤。

    1. 为所有设备单独编译
    2. 与 lipo 合并

    例如。

    -create /libsrtp-arm64-apple-darwin_ios.a /libsrtp-i386-apple-darwin_ios.a -output output_file_name

    然后使用output_file_name.a 作为所有设备和模拟器的通用库

    检查支持的架构:output_file_name.a

    lipo -info name_of_static_lib

    output : /libsrtp-universal-apple-darwin_ios.a are: armv7 armv7s i386 x86_64 arm64

    Compile PJSIP 2.5 Library for all archietectures

    谢谢

    【讨论】:

    • 你可以在这个链接trac.pjsip.org/repos/wiki/Getting-Started/iPhone得到所有答案
    • 我尝试先为架构 armv7s 编译,然后为 arm64 编译,这样我继续为所有架构编译。所有架构编译成功,但问题是最后编译的库只能正常工作,其他框架库编译结果被覆盖。编译结果出现在路径:/MyApps/2.2/2.2_original2/pjsip-apps/build/output。如果您知道正确的编译方法,请帮助我。非常感谢您的帮助。
    • 只为每个架构编译,例如。 armv7s 并将其保存在单独的文件夹中,其他也类似。最后从每个架构中选择通用的 .a 文件,然后通过 lipo -create -output 命令进行合并。这样做,例如。 lipo -create libSignatureLibary_armv6.a libSignatureLibary_armv7.a libSignatureLibary_i368.a -output libSignatureLibary.a
    • 最后我创建了与所有架构兼容的所有 .a 文件。但是当我运行模拟器时,xCode 仍然找不到库并给出错误。 “Build Setting”里面有什么需要改变的设置吗?
    • 然后在“Header Search Paths”中设置“pjsip-include”的路径:
    【解决方案3】:

    我们编写了一个 cocoapod,它将创建一个静态库,您可以将其包含在您的项目中。目前你只能在 Objective C cocoapod 环境中使用它。我们正在开发一个版本,该版本将创建一个动态库,以便它可以与 Swift 一起使用。

    请查看:

    https://github.com/VoIPGRID/Vialer-pjsip-iOS

    我们制作了一个开源包装器,它可以让您更轻松地将 PJSIP 集成到您的 iOS 项目中:

    https://github.com/VoIPGRID/VialerSIPLib

    【讨论】:

    【解决方案4】:

    像这样发布的合并

    lipo -create /My\ Project/pjsip-universal/x86_64/libgsmcodec-x86_64-apple-darwin_ios.a /My\ Project/pjsip-universal/i386 /libgsmcodec-i386-apple-darwin_ios.a /My\ Project/pjsip-universal/armv7s/libgsmcodec-armv7s-apple-darwin_ios.a /My\ Project/pjsip -universal/armv7/libgsmcodec-armv7-apple-darwin_ios.a /My\ Project/pjsip-universal/arm64/libgsmcodec-arm64-apple-darwin_ios.a -输出 /My\ Project/pjsip-universal/universal/libgsmcodec-universal-apple-darwin_ios.a

    最后测试一下

    lipo -info /My\ Project/pjsip-universal/libgsmcodec-universal-apple-darwin_ios.a

    输出: fat 文件中的架构:/My Project/pjsip-universal/libgsmcodec-universal-apple-darwin_ios.a 是:i386 armv7s armv7 x86_64 arm64

    生成通用架构后:

    点击此链接从链接中的这一行添加您的项目

    将头文件添加到项目中

    how to add in project

    希望这会对你有所帮助。

    【讨论】:

    • 是的,没错!但不会生成 arm64、armv7、armv7s、i386、x86_64、universal、pjsip-include 等文件夹。是否有任何特定的命令来管理目录?现在所有这些 .a 文件都直接在third_party/lib 下生成。我知道只有你的帮助才能让我摆脱困境。
    • 我已经为不同的架构分别创建了这些文件夹,方法是按照上面链接中给出的从这些位置收集 .a "pjsip_include" 文件夹包含库的头文件。有关它的更多信息,请点击上面的链接。 "universal" 文件夹包含我创建的每个 .a 文件的通用库。在每个架构中将有 19 个项目。请点击链接,该链接将描述您必须从何处复制每个架构的 .a 文件。
    【解决方案5】:

    我正在使用这个脚本为我的拱门构建 pjsip。

    我在 pjsip 根文件夹中运行它,它会创建一个 uni 文件夹,其中包含我然后链接/添加到的结果库我的项目。

    #!/bin/bash
    
    ARCHS="armv7 armv7s arm64"
    mkdir -p uni
    
    echo "Compiling..."
    for arch in $ARCHS
    do
      echo $arch
      echo "=================================="
      echo
      ARCH="-arch $arch" ./configure-iphone && make dep && make clean && make
      echo "Done."
      echo
    done
    
    RESULT_PATHS="pjlib/lib pjlib-util/lib pjmedia/lib pjsip/lib pjnath/lib third_party/lib"
    for path in $RESULT_PATHS
    do
      echo $path
      for file in `ls $path/*-armv7-*`
      do
        library=`echo $file | sed "s/-armv7-\(.*$\)//g"`
        library_tail=`echo $file | sed "s/.*-armv7-//g"`
        lipo -arch armv7 $library-armv7-$library_tail -arch armv7s $library-armv7s-$library_tail -arch arm64 $library-arm64-$library_tail -create -output $library.a
        cp -vi $library.a uni
      done
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多