关于你的两点:
-
是的,您需要为您的目标平台交叉编译 thrift 库。当你交叉编译你的服务器时,它必须链接到这个库。
-
不,您不需要交叉编译 thrift-compiler。 thrift 编译器是一个源到源编译器。它只需在您的开发平台上运行,即可将协议定义转换为 C++ 代码(或 JavaScript 代码)。此代码与平台无关,因此 thrift 编译器不需要了解您的目标平台。然后,您将获取生成的代码,并在使用 C++ 的情况下为您的目标平台交叉编译它,就像为您的手写代码一样。
要在目标设备上运行您的 thrift 服务器,您需要执行以下步骤:
获取 thrift 库的交叉编译版本
要求:
- 目标平台的工具链
- boost 的交叉编译版本
- openssl 的交叉编译版本
最近版本的 thrift 带有一个 cmake 构建脚本。要使用 cmake 进行交叉编译,您将编写一个指向您的工具链的 toolchain.cmake 文件(link、link)。工具链定义可以通过-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 并使用在您的主机系统上运行的匹配客户端连接到服务器。