如何在手臂上使用节俭

时间:2019-03-14 09:17:49

标签: arm cross-platform cross-compiling thrift

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

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

可能有两个步骤:

  1. 当我安装thrift时(有一个主机配置选项,但我不知道我是否应该简单地放置“ arm”或工具链)。

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

我在这里很困惑。

谢谢。

1 个答案:

答案 0 :(得分:0)

关于您的两点:

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

  2. 否,您不需要交叉编译节俭的编译器。节俭的编译器是一个源到源的编译器。它仅需在您的开发平台上运行,即可将协议定义转换为C ++代码(或JavaScript代码)。该代码与平台无关,因此节俭的编译器无需了解您的目标平台。然后,您将获取生成的代码,对于C ++,将其与目标代码进行交叉编译,就像为手写代码进行交叉编译一样。

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

获取旧版库的交叉编译版本

要求:

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

节俭的最新版本带有cmake构建脚本。要使用cmake进行交叉编译,您需要编写一个指向工具链(linklink)的toolchain.cmake文件。可以使用cmake

将工具链定义传递给-DCMAKE_TOOLCHAIN_FILE:PATH=...

对于其余的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编译器的预编译版本,也可以使用{{1 }}标志已激活)。

BUILD_COMPILER

这将在文件夹thrift --gen cpp path/to/your/protocol.thrift 中生成C ++文件。

交叉编译您的代码

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

例如,如果您有一个./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指向在第一部分中获得的交叉编译的cmake -S . -B out -DCMAKE_TOOLCHAIN_FILE:PATH="path/to/toolchain.cmake" 。在libthriftd.so文件夹中,运行out。这为您提供了目标二进制文件make

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