linux-Qt Creator为Raspberry Pi 2的交叉编译和远程部署进行了正确的设置-生成错误架构的二进制文件
作者:互联网
我刚刚经历了麻烦,设置了Qt Creator,Raspberry Pi和Debian 8(用于我的笔记本),最后设法配置了所有东西.还是我想.接下来是对我到目前为止所做的事情的描述,以便Stackoverflow上的一些智者可能会看到我所做的愚蠢的事情(或未完成:D).
我正在使用以下平台:
>运行最新Raspbian的Raspberry Pi 2-我要在其中运行代码的目标平台
> 64位Debian 8 Jessie-我要在其中开发代码的开发平台
在启动SSH并使其在笔记本(Debian)和RPi2(Raspbian)之间运行之后,我开始四处寻找有关如何设置我最喜欢的C/C++ IDE Qt Creator来为RPi2开发应用程序的教程.项目工具是cmake(我在下面提到这一点,因为另一个选项-使用qmake-也可以使用,并且更容易使用,但是对于我的项目cmake是必需的).
这里的关键字当然是交叉编译和远程部署.
> Getting the toolchain for the cross-compilation-对arm-linux-gnueabihf-g最为有用,这是交叉编译所必需的(我不想使用CodeSourcery g).文章指出armhf用于RPi2,这就是为什么我特别选择此编译器
> Configure Qt Creator Part 1 – Adding a Linux device, a development kit and compiler-基本上,您在这里告诉Qt Creator您的目标平台(在本例中为RPi2被认为是通用Linux设备),并添加ARM编译器并生成开发套件,我将其称为RPi2 Kit:
> Configure Qt Creator Part 2 – Changing build, run and deployment configuration for the CMake project:
>构建配置正在添加新创建的工具包(请参阅
2)):
确认将使用RPi2套件构建项目:
>部署配置只是在CMake项目的根文件夹中添加QtCreatorDeployment.txt:
sftp://192.168.1.102/
build/RPiCrossCompileRemoteTest:home/pi/Projects
第一行表示部署前缀,第二行表示可执行文件的相对本地路径(在我的笔记本上)(在左侧)和相对远程路径(在我的RPi2上). Qt Creator的文档还添加了使用CMakeLists.txt自动化此过程的步骤,但作为第一步尝试,我认为最好手动完成.另外,您还可以根据需要添加多个路径(由于我无法使用单个路径-_-,因此我不需要这样做).
额外的步骤涉及更改项目的部署部分(在“运行”配置中找到)中的几件事-检查可用空间(我决定这样做,以防万一我开始构建大型应用程序并且空间用尽了然后管理为了跟踪:3),通过SFTP上传文件,最后我添加了运行自定义远程命令的权限,该命令只是将一些愚蠢的消息写到文本文件(在我的RPi2上!)上作为日志:
>项目的运行配置也应该轻而易举.我唯一更改的是将项目的工作目录设置为RPi2上的远程位置:
最后,这是我使用的代码:
#include <fstream>
#include <string>
#include <iostream>
int main()
{
std::cout << "Writing to remote system...";
try
{
std::string input = "This is a cross-compilation and remote deployment test for Raspberry Pi using Qt Creator";
std::ofstream out("remote_log.txt");
out << input;
out.close();
}
catch(std::exception e)
{
std::cout << "Failed" << std::endl;
return 1;
}
std::cout << "Successful" << std::endl;
return 0;
}
以及CMakeLists.txt:
project(RPiCrossCompileRemoteTest)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
好吧?错误!这是我无法弄清丢失或做错什么的地方-构建项目时,生成的二进制文件用于笔记本的体系结构.这是命令文件RPiCrossCompileRemoteTest的输出:
RPiCrossCompileRemoteTest: ELF 64-bit LSB executable, x86-64, version 1
(SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for
GNU/Linux 2.6.32, BuildID[sha1]=73a819def72e496aab31127add9fb52df2ac2c47,
not stripped
是的,它说得很清楚-x86-64.部署不会引起任何错误(SSH连接成功,并且将文本文件写入RPi2没有任何问题),在笔记本上运行二进制文件(通过Qt Creator或终端)也不会引起任何错误.但是我注意到的另一件事是,由于某种原因,SFTP无法上传我的二进制文件.是的,该二进制文件的体系结构不正确,我无法在RPi2上执行它,但仍然应该上传它吗?
我还检查了由于某种原因是否通过手动编译main并生成二进制文件选择了错误的编译器:
:~$arm-linux-gnueabihf-g++ main.cpp -o RPiCrossCompileRemoteTest_Manual
我有一个不错的ARM二进制文件,可以复制并在RPi2上运行.还向我显示了文件RPiCrossCompileRemoteTest_Manual的输出中的其他确认:
RPiCrossCompileRemoteTest_Manual: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV),
dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux
2.6.32, BuildID[sha1]=8aca4ed570c44a51a820c6aa56e6257129e0c949, not stripped
我不知道我在做什么错.我觉得我非常非常接近使此事情生效,但是!我几个小时的努力都是徒劳的.
非常感谢帮助!
PS:请注意,我尚未设置调试器.在准备好基础知识并运行并阅读了有关远程调试的更多信息之后,我计划下一步要做的是.
解决方法:
好的,我可以编译了.问题出在CMakeLists.txt中.您必须指定目标系统和编译器. Qt Creator不会自动执行此操作,因为它会从CMakeLists.txt中读取所有内容,尽管这让我怀疑定义套件(连同捆绑的编译器和调试器)有什么好处,如果您仍然要手动执行所有操作.可能这仅在您使用Qt项目时有效.将不得不检查出来.无论如何,这是扭转局面的几行:
INCLUDE(CMakeForceCompiler)
# Set OS and processor architecture
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_SYSTEM_VERSION 1)
# Specify the compilers
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
至于通过SFTP上载的问题,似乎QtCreatorDeployment.txt的文档是用非常混乱的方式编写的.我注意到它会自动附加项目的根路径.它实际上所做的远非如此.它只是接管并在内部接管.因此,基本上,在我的部署配置文件中只剩下了远程路径.我试过了
sftp://192.168.1.102/home/pi/Projects/
而且没有用但是,如果删除sftp和IP地址,则它实际上可以工作,因为Qt Creator会自动从设备配置中提取IP地址部分.因此,最终的QtCreatorDeployment.txt就是这一行(如果需要,您可以添加多行):
/home/pi/Projects/
这是它在Qt Creator中的显示方式:
>这是由Qt Creator完全自动完成的.可能可以更改它,但就我而言,它可以正常工作
>这是从QtCreatorDeployment.txt中提取的内容.它的显示方式令人困惑,因为人们希望也可以显示到远程设备的IP地址.由于设备配置,它仍然存在.
而已!现在,我可以将我的ARM二进制文件正确部署到远程系统了.
标签:arm,raspberry-pi2,deployment,qt-creator,linux 来源: https://codeday.me/bug/20191028/1948872.html