代码之家  ›  专栏  ›  技术社区  ›  Footniko

用于arm的WebRTC构建

  •  3
  • Footniko  · 技术社区  · 12 年前

    我想用arm926ej-s处理器为我的小型机器构建webrtc。
    安装depot_tools后,我执行了以下步骤:

    gclient config http://webrtc.googlecode.com/svn/trunk
    gclient sync --force
    cd trunk
    ninja -C out/Debug
    

    一切正常,我可以运行一些二进制文件,这些文件是我编译后得到的。
    现在,我想为我的手臂机器编译。我执行以下操作:

    rm -rf out
    export GYP_CROSSCOMPILE=1
    export GYP_DEFINES="target_arch=arm arm_float_abi=hard"
    export CC=/path/to/my/gcc
    export CXX=/path/to/my/g++
    export AR=/path/to/my/ar
    export CC_host=gcc 
    export CXX_host=g++ 
    gclient runhooks --force 
    

    还是很顺利。。。
    但当我尝试用命令编译它时:

    ninja -C out/Debug
    

    我有很多错误,比如:

    CC obj/chromium/src/third_par...p/srtp/crypto/cipher/libsrtp.aes_cbc.o
    FAILED: /opt/virt2real-sdk/codesourcery/arm-2013.05/bin/arm-none-linux-gnueabi-gcc -MMD -MF obj/chromium/src/third_party/libsrtp/srtp/crypto/cipher/libsrtp.aes_cbc.o.d -DHAVE_STDLIB_H -DHAVE_STRING_H -DV8_DEPRECATION_WARNINGS -D_FILE_OFFSET_BITS=64 -DHAVE_INT16_T -DHAVE_INT32_T -DHAVE_INT8_T -DHAVE_UINT16_T -DHAVE_UINT32_T -DHAVE_UINT64_T -DHAVE_UINT8_T -DHAVE_STDINT_H -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -DINLINE=inline -DCPU_CISC -DCHROMIUM_BUILD -DCR_CLANG_REVISION=214024 -DTOOLKIT_VIEWS=1 -DUI_COMPOSITOR_IMAGE_TRANSPORT -DUSE_AURA=1 -DUSE_ASH=1 -DUSE_PANGO=1 -DUSE_CAIRO=1 -DUSE_GLIB=1 -DUSE_DEFAULT_RENDER_THEME=1 -DUSE_LIBJPEG_TURBO=1 -DUSE_X11=1 -DUSE_CLIPBOARD_AURAX11=1 -DENABLE_ONE_CLICK_SIGNIN -DENABLE_PRE_SYNC_BACKUP -DUSE_XI2_MT=2 -DENABLE_REMOTING=1 -DENABLE_WEBRTC=1 -DENABLE_PEPPER_CDMS -DENABLE_CONFIGURATION_POLICY -DENABLE_NOTIFICATIONS -DUSE_UDEV -DENABLE_EGLIMAGE=1 -DENABLE_TASK_MANAGER=1 -DENABLE_EXTENSIONS=1 -DENABLE_PLUGINS=1 -DENABLE_SESSION_SERVICE=1 -DENABLE_THEMES=1 -DENABLE_AUTOFILL_DIALOG=1 -DENABLE_BACKGROUND=1 -DENABLE_GOOGLE_NOW=1 -DCLD_VERSION=2 -DCLD2_DATA_SOURCE=static -DENABLE_FULL_PRINTING=1 -DENABLE_PRINTING=1 -DENABLE_SPELLCHECK=1 -DENABLE_CAPTIVE_PORTAL_DETECTION=1 -DENABLE_APP_LIST=1 -DENABLE_SETTINGS_APP=1 -DENABLE_MANAGED_USERS=1 -DENABLE_MDNS=1 -DENABLE_SERVICE_DISCOVERY=1 -DUSE_NSS=1 -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DWTF_USE_DYNAMIC_ANNOTATIONS=1 -D_DEBUG -D_GLIBCXX_DEBUG=1 -I../../chromium/src/third_party/libsrtp/config -I../../chromium/src/third_party/libsrtp/srtp/include -I../../chromium/src/third_party/libsrtp/srtp/crypto/include -Igen -fstack-protector --param=ssp-buffer-size=4 -Werror -pthread -fno-exceptions -fno-strict-aliasing -Wno-unused-parameter -Wno-missing-field-initializers -fvisibility=hidden -pipe -fPIC -Wno-reserved-user-defined-literal -Xclang -load -Xclang /home/footniko/my/webrtcnative/trunk/tools/clang/scripts/../../../third_party/llvm-build/Release+Asserts/lib/libFindBadConstructs.so -Xclang -add-plugin -Xclang find-bad-constructs -fcolor-diagnostics -Wheader-hygiene -Wno-char-subscripts -Wno-unneeded-internal-declaration -Wno-covered-switch-default -Wstring-conversion -Wno-c++11-narrowing -Wno-deprecated-register -Wno-format -Wno-unused-result -target arm-linux-gnueabihf -march=armv7-a -no-integrated-as -mtune=generic-armv7-a -mfpu=neon -mfloat-abi=hard -mthumb --sysroot=/home/footniko/my/webrtcnative/trunk/arm-sysroot -O0 -g -funwind-tables -Wno-undefined-bool-conversion -Wno-tautological-undefined-compare   -c ../../chromium/src/third_party/libsrtp/srtp/crypto/cipher/aes_cbc.c -o obj/chromium/src/third_party/libsrtp/srtp/crypto/cipher/libsrtp.aes_cbc.o
    arm-none-linux-gnueabi-gcc: error: unrecognized command line option '-Xclang'
    arm-none-linux-gnueabi-gcc: error: unrecognized command line option '-Xclang'
    arm-none-linux-gnueabi-gcc: error: unrecognized command line option '-Xclang'
    arm-none-linux-gnueabi-gcc: error: unrecognized command line option '-add-plugin'
    arm-none-linux-gnueabi-gcc: error: unrecognized command line option '-Xclang'
    arm-none-linux-gnueabi-gcc: error: find-bad-constructs: No such file or directory
    arm-none-linux-gnueabi-gcc: error: unrecognized command line option '-fcolor-diagnostics'
    arm-none-linux-gnueabi-gcc: error: unrecognized command line option '-Wheader-hygiene'
    arm-none-linux-gnueabi-gcc: error: unrecognized command line option '-Wstring-conversion'
    arm-none-linux-gnueabi-gcc: error: unrecognized command line option '-target'
    arm-none-linux-gnueabi-gcc: error: arm-linux-gnueabihf: No such file or directory
    arm-none-linux-gnueabi-gcc: error: unrecognized command line option '-no-integrated-as'
    
    1 回复  |  直到 12 年前
        1
  •  4
  •   Alex    12 年前

    我也遇到了这个问题,但这是因为与编译器选择(CC、CXX等)相关的导出。事实上,这会让你出错,因为gcc无法识别-Xclang。

    这里是我用来尝试编译的方法。然而,似乎webrtc主干正在快速移动,最近几天它不再工作了。与你的问题和9dan的建议相关的最大变化是:你需要说你想以android(和linux)为目标,为此你需要android_tools。但现在,它不是从webrtc中提取的,你应该从铬中提取。

    以下是安装过程的摘要。

    系统要求:

    首选至少30Gb虚拟驱动器空间和8GbRAM上的虚拟化Lubuntu14.04 64位:

    _Lubuntu is fast to use when virtualized and it is based on ubuntu which is necessary since installation scripts rely on ubuntu software packages names
    _64bit is necessary since scripts like install-build-deps.sh expect 64bit system and install specific 32bit libraries
    _30Gb at least because standard (non cross compiling) webrtc requires at least 10Gb but when adding all cross compiling stuff, drive space explodes !
    _8GbRAM to be able to compile and link everything
    

    然后,在此主机上,安装过程如下:

    基本初步设置。。。假设没有导出后面讨论的变量

    首先安装必要的软件包,以便能够获取数据并使用java:

    // ensure all required depot are ready
    sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) main universe restricted multiverse"
    // install most essential packages prior to fetching
    sudo apt-get install openjdk-7-jdk git subversion
    

    初始Webrtc获取

    创建一个目录以获取并运行

    mkdir WebRTC
    cd WebRTC
    git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
    export PATH=<location of depot_tools>:"$PATH" // example : export PATH=/home/testing/WebRTC/depot_tools:"$PATH"
    export JAVA_HOME=<location of Java SE 6 - JDK>  // example : export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/
    gclient config http://webrtc.googlecode.com/svn/trunk 
    gclient sync --force
    

    注意0:有时它会失败,因为没有找到gcc、pkg-config等。这通常发生在缺少大量软件包的新安装上。 幸运的是,应该已经下载了脚本:

    trunk/built/install-build-deps.sh 
    

    运行它以安装所有必需的软件包,然后重新运行

    gclient sync --force
    

    添加所有必要的android sdk&目标武器系统所需的ndk

    echo "target_os = ['android', 'unix']" >> .gclient
    gclient sync
    cd trunk
    source ./build/android/envsetup.sh
    export GYP_DEFINES="$GYP_DEFINES OS=android"
    gclient runhooks
    

    注1:webrtc不再直接提供android工具。建议使用铬合金。 然后,在Webrtc文件夹或另一个文件夹中(例如,原始位置:trunk/thred_party/)。

    cd myTargetDirectory // example cd trunk/third_party/
    git clone https://chromium.googlesource.com/android_tools
    

    获取android_tools后,配置项目以查看它。编辑:

    trunk/chromium/src/third_party/openmax_dl/dl/dl.gyp
    

    并通过在文件开头的“variables”部分添加以下行来添加所需的变量android_ndk_root:

    'android_ndk_root':'<WebRTCfolder>/trunk/third_party/android_tools/ndk/',
    example   'android_ndk_root':'/home/testing/WebRTC/trunk/third_party/android_tools/ndk/',
    

    也可以在.bashrc中导出ANDROID_NDK_ROOT

    export ANDROID_NDK_ROOT=<WebRTCfolder>/trunk/third_party/android_tools/ndk/
    example export ANDROID_NDK_ROOT=/home/testing/WebRTC/trunk/third_party/android_tools/ndk/
    

    为基于armv7a的平台准备交叉编译

    // install all necessary packages
    cd trunk
    ./build/install-build-deps.sh --arm
    ./build/install-build-deps-android.sh
    

    /*=>在不同的实验之后,我使用了上面的命令,但我想从一个非常干净的安装来看,这不是绝对必要的。无论如何,如果完成了,应该在后面使用命令“./build/install-build-deps.sh--arm”,以便交换一些跨编译器包 (主要是为了保持安装了g++-arm-linux-gnueabihf和gcc-arm-linux-GNUabihf) */

    ./build/linux/install-arm-sysroot.py
    export GYP_CROSSCOMPILE=1 /* => i used it but i ask myself if it is still necessary since an automatic declaration is performed later on.*/
    
    export GYP_DEFINES="OS=linux target_arch=arm arm_version=7 arm_use_neon=1"
    // other options like  arm_fpu=vfpv3-d16 arm_float_abi=softfp are set by default, actually, even arm_vervion=7 and use_neon=1 */
    

    这里,目标是linux arm,所以这应该足够了,但如果目标是android,则可能需要定义以下变量

    export ANDROID_SDK_VERSION=19
    export GYP_DEFINES="$GYP_DEFINES  android_sdk_version=19"
    

    注2:以下导出通常在指南和教程中报告。然而,当使用时,它们会带来一些问题(无法识别-Xclang标志等)。似乎它们不再有用,因为吉普赛文件会自动调整这些设置!对我来说,避免它们是获得配置和开始编译工作的唯一途径。

    export CC=arm-linux-gnueabihf-gcc
    export CXX=arm-linux-gnueabihf-g++
    export AR=arm-linux-gnueabihf-ar
    export CC_host=gcc
    export CXX_host=g++
    

    最后,在进入最后的编译步骤之前配置系统

    cd ..
    gclient runhooks --force
     cd trunk/
    

    潜在错误1,已解决

    首先出现以下错误: =>gyp:chromium/src/thred_party/openmax_dl/dl/dl.gyp中未定义的变量android_ndk_root =>回到上一节,您肯定忘记在enlighted文件中定义android_ndk_root变量: “android_ndk_root”:“/trunk/third_party/android_tools/ndk/”, */

    潜在错误2,已解决

    当尝试以trunk/build/linux/pkg-config包装器为目标时,出现了一个相对链接问题,您可以得到类似的结果: 正在从gyp文件更新项目。。。 /bin/sh:../..//build/linux/pkg-config包装器:没有这样的文件或目录 吉普赛人:呼叫'../..//build/linux/pkg-config wrapper“/media/workspace/lib/webrtc/trunk/arm-sysroot”“arm”--libs-only-L--libs-only其他nss返回退出状态127。在尝试加载trunk/all.yp时加载trunk/all.gyp的依赖项 错误:命令/usr/bin/python-trunk/build/gypt_chromium--depth=trunk trunk/all.gyp-Dextra_gyp_flag=0在/media/workspace/lib/webrtc中返回非零退出状态1 =>如果要为所有出现此错误的文件解决此问题,请查找以下错误文件:

    grep -Ir --exclude=\*.{c,h} "../../../build/linux/pkg-config-wrapper" *
    

    并替换pkg配置行中的相关相对路径部分(在找到的每个文件的开头: 'pkg-config':'trunk/build/linux/pkg-config wrapper“<(sysroot)”“<(target_arch)”',

    gclientrunhooks—强制

    最后编译步骤

    cd trunk
    ninja -C out/Release/
    ninja -C out/Debug/ // if required
    

    一个想法:sudo apt-get安装gcc arm linux androidabi 您应该以第三方/android_tools/ndk/platforms/androidXXX/arch-arm/usr/include/sys为目标/

    //如果clang有问题,可以使用此附加选项取消激活它(之后重新运行gclien runhooks)

    export GYP_DEFINES="$GYP_DEFINES clang=0"