我正在尝试将Thrift用于在我的ARM设备上运行的C ++和javascript,并且该项目是在具有此ARM设备的IDE的Linux主机上构建的。
我的问题是,何时以及如何使用交叉编译?
可能有两个步骤:
2当我使用thrift命令生成带有某些选项的源代码时。
我在这里很困惑。
谢谢。
答案 0 :(得分:0)
关于您的两点:
是的,您需要交叉编译目标平台的Thrift库。当您交叉编译服务器时,它必须链接到该库。
否,您不需要交叉编译节俭的编译器。节俭的编译器是一个源到源的编译器。它仅需在您的开发平台上运行,即可将协议定义转换为C ++代码(或JavaScript代码)。该代码与平台无关,因此节俭的编译器无需了解您的目标平台。然后,您将获取生成的代码,对于C ++,将其与目标代码进行交叉编译,就像为手写代码进行交叉编译一样。
要在目标设备上运行Thrift服务器,您将需要执行以下步骤:
要求:
节俭的最新版本带有cmake构建脚本。要使用cmake进行交叉编译,您需要编写一个指向工具链(link,link)的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编译器以根据协议规范生成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
,并使用主机系统上运行的匹配客户端连接到服务器。