【问题标题】:How to use thrift on arm如何在手臂上使用节俭
【发布时间】:2019-03-14 09:17:49
【问题描述】:

我正在尝试将 Thrift 用于在我的 ARM 设备上运行的 C++ 和 javascript,并且该项目是在 Linux 主机上构建的,该主机带有适用于该 ARM 设备的 IDE。

我的问题是我应该何时以及如何使用交叉编译?

有两个可能的步骤:

  1. 当我安装 thrift 时(有一个主机配置选项,但我不知道我应该简单地输入 'arm' 还是工具链)。

2 当我使用带有某些选项的 thrift 命令生成源代码时。

我在这里很困惑。

谢谢。

【问题讨论】:

    标签: arm cross-platform cross-compiling thrift


    【解决方案1】:

    关于你的两点:

    1. 是的,您需要为您的目标平台交叉编译 thrift 库。当你交叉编译你的服务器时,它必须链接到这个库。

    2. 不,您不需要交叉编译 thrift-compiler。 thrift 编译器是一个源到源编译器。它只需在您的开发平台上运行,即可将协议定义转换为 C++ 代码(或 JavaScript 代码)。此代码与平台无关,因此 thrift 编译器不需要了解您的目标平台。然后,您将获取生成的代码,并在使用 C++ 的情况下为您的目标平台交叉编译它,就像为您的手写代码一样。

    要在目标设备上运行您的 thrift 服务器,您需要执行以下步骤:

    获取 thrift 库的交叉编译版本

    要求:

    • 目标平台的工具链
    • boost 的交叉编译版本
    • openssl 的交叉编译版本

    最近版本的 thrift 带有一个 cmake 构建脚本。要使用 cmake 进行交叉编译,您将编写一个指向您的工具链的 toolchain.cmake 文件(linklink)。工具链定义可以通过-DCMAKE_TOOLCHAIN_FILE:PATH=... 传递给cmake

    对于剩余的 cmake 选项,您几乎可以关闭除 C++ 库(或 C 库,如果您愿意的话)之外的所有内容:

    cmake -S . -B out \
      -DBUILD_CPP=on \
      -DBUILD_COMPILER=off \
      -DBUILD_TESTING=off \
      -DBUILD_C_GLIB=off \
      -DBUILD_AS3=off \
      -DBUILD_JAVA=off \
      -DBUILD_JAVASCRIPT=off \
      -DBUILD_NODEJS=off \
      -DBUILD_PYTHON=off \
      -DBUILD_HASKELL=off \
      -DWITH_QT5=off \
      -DWITH_OPENSSL=on \
      -DCMAKE_CXX_STANDARD=14 \
      -DCMAKE_TOOLCHAIN_FILE:PATH="path/to/your/toolchain.cmake"
    

    (根据您的设置,可能需要一些额外的选项来指向 boost 和 openssl,但如果不了解您的工具链,我无法确定。)

    构建过程产生thrift库的目标版本:

    ./out/lib/libthriftd.so
    

    使用主机 Thrift 编译器生成代码

    在您的主机系统上运行 thrift 编译器以根据您的协议规范生成 C++ 代码(使用您的主机系统提供的 thrift 编译器的预编译版本,或者为您的主机系统再次编译 thrift,使用 BUILD_COMPILER标志已激活)。

    thrift --gen cpp path/to/your/protocol.thrift
    

    这会导致文件夹 ./gen-cpp 中的 C++ 文件。

    交叉编译您的代码

    为服务器交叉编译您的手写代码,以及在./gen-cpp 中生成的代码。

    例如,如果您有一个Server.cpp,您可以编写以下CMakeLists.txt

    project( my-server CXX )
    
    set( THRIFT_FILES
        ${CMAKE_CURRENT_SOURCE_DIR}/gen-cpp/HelloWorld.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/gen-cpp/HelloWorld.h
        ${CMAKE_CURRENT_SOURCE_DIR}/gen-cpp/protocol_constants.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/gen-cpp/protocol_constants.h
        ${CMAKE_CURRENT_SOURCE_DIR}/gen-cpp/protocol_types.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/gen-cpp/protocol_types.h
    )
    
    add_library(
        my-generated-code
        OBJECT ${THRIFT_FILES}
    )
    
    add_executable(${PROJECT_NAME}
        ${CMAKE_CURRENT_SOURCE_DIR}/Server.cpp
        $<TARGET_OBJECTS:my-generated-code>
    )
    
    target_link_libraries(${PROJECT_NAME} thriftd)
    

    您可以使用以下代码交叉编译服务器:

    cmake -S . -B out -DCMAKE_TOOLCHAIN_FILE:PATH="path/to/toolchain.cmake"
    

    根据您的设置,您可能需要其他选项将 cmake 指向在第一部分中获得的交叉编译的libthriftd.so。在out 文件夹中,运行make。这会给你一个目标二进制文件./out/my-server

    然后您可以将my-server 二进制文件和libthriftd.so 部署到您的目标系统。这应该允许您在目标系统上运行 my-server 并使用在您的主机系统上运行的匹配客户端连接到服务器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 2016-03-09
      • 1970-01-01
      • 2014-03-24
      相关资源
      最近更新 更多