Programim dhe zhvillim, javascript, python, php, html

Konfigurimi i duhur i Qt Creator për përpilim të kryqëzuar dhe vendosje në distancë për Raspberry Pi 2 - duke prodhuar binare për arkitekturë të gabuar

Sapo kalova në ferr për të konfiguruar Qt Creator, Raspberry Pi dhe Debian 8 (për fletoren time) dhe më në fund arrita të konfiguroja gjithçka. Ose kështu mendova. Ajo që vijon këtu është një përshkrim i asaj që kam bërë deri tani, në mënyrë që disa njerëz të mençur këtu në Stackoverflow të shohin diçka marrëzi që kam bërë (ose nuk e kam bërë :D).

Unë jam duke përdorur platformat e mëposhtme:

  • Raspberry Pi 2 ekzekuton Raspbian-in më të fundit - platforma e synuar ku dua të ekzekutoj kodin tim
  • 64bit Debian 8 Jessie - platforma e zhvillimit ku dua të zhvilloj kodin tim

Pasi e vendosa SSH-në time në funksion midis notebook-ut tim (Debian) dhe RPi2 (Raspbian) fillova të kërkoja udhëzues se si të konfiguroja C/C++ IDE Qt Creator tim të preferuar për zhvillimin e aplikacioneve për RPi2. Mjeti i projektit është cmake (po e përmend këtë më poshtë pasi opsioni tjetër - përdorimi i qmake - është gjithashtu i disponueshëm dhe është më i lehtë për t'u punuar, por për projektin tim cmake është i detyrueshëm).

Fjalët kyçe këtu janë të përpilimit të ndërthurur dhe vendosjes në distancë.

  1. Marrja e zinxhirit të veglave për përpilimin e kryqëzuar - kryesisht i dobishëm për arm-linux-gnueabihf-g++, i cili kërkohet për përpilimin e kryqëzuar (nuk dua të përdor CodeSourcery g++). Artikulli thotë se armhf është për RPi2 dhe kjo është arsyeja pse zgjodha këtë përpilues në veçanti

  2. Konfiguro Pjesën 1 të Krijuesit Qt - Shtimi i një pajisjeje Linux, një çantë zhvillimi dhe përpiluesi - në thelb këtu ju tregoni Qt Creator platformën tuaj të synuar, e cila në këtë rast është një RPi2 konsiderohet të jetë një pajisje e përgjithshme Linux dhe duke shtuar përpiluesin ARM plus gjenerimin e një komplete zhvillimi, të cilin e quajta RPi2 Kit :

Shtimi i përpiluesit ARM

Krijimi i një komplete zhvillimi

  1. Konfiguro Pjesën e Krijuesit Qt 2 - Ndryshimi i konfigurimit të ndërtimit, ekzekutimit dhe vendosjes për projektin CMake:

    • The build configuration is adding the newly created kit (see 2)):

fut përshkrimin e imazhit këtu

Konfirmimi që projekti do të ndërtohet duke përdorur Kit RPi2:

fut përshkrimin e imazhit këtu

  • Konfigurimi i vendosjes thjesht shton një QtCreatorDeployment.txt në dosjen rrënjë të projektit CMake:

        sftp://192.168.1.102/
        build/RPiCrossCompileRemoteTest:home/pi/Projects
    

    Rreshti i parë përfaqëson prefiksin e vendosjes dhe rreshti i dytë përshkruan shtegun përkatës lokal (në fletoren time) të skedarit të ekzekutueshëm (në të majtë) dhe shtegun relative të largët (në RPi2 tim). Dokumentacioni i Qt Creator shton gjithashtu një hap për automatizimin e këtij procesi brenda CMakeLists.txt, por si përpjekje e parë mendoj se është më mirë ta bësh me dorë. Gjithashtu ju mund të shtoni shtigje të shumta nëse keni nevojë (gjë që unë nuk e bëj në rastin tim pasi nuk mund të funksionoj një shteg të vetëm -_-).

    Hapat shtesë përfshijnë ndryshimin e disa gjërave në seksionin e vendosjes së projektit (që gjenden në konfigurimin Run) - kontrollimi i hapësirës së lirë (vendosa ta bëj këtë në rast se filloj të ndërtoj aplikacione të mëdha dhe hapësira mbaron më shpejt, atëherë e menaxhoj për të mbajtur gjurmët :3), ngarkoni skedarët përmes SFTP dhe më në fund shtova ekzekutimin e një komande të personalizuar në distancë, e cila thjesht shkruan në një skedar teksti (në RPi2 tim!) një mesazh budalla si regjistër:

fut përshkrimin e imazhit këtu

  • Konfigurimi i ekzekutimit të projektit duhet të ketë qenë gjithashtu i lehtë. E vetmja gjë që ndryshova ishte vendosja e drejtorisë së punës të projektit tim në vendndodhjen e largët në RPi2 tim:

fut përshkrimin e imazhit këtu

Më në fund këtu është kodi që përdor:

#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;
}

së bashku me CMakeLists.txt:

project(RPiCrossCompileRemoteTest)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})

Në rregull? GABIM! Këtu e kam problem të kuptoj se çfarë më mungon ose çfarë po bëj gabim - kur ndërtoj projektin tim, binarët e prodhuar janë për arkitekturën e fletores sime. Këtu është dalja e komandës file 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

Po, e thotë me zë të lartë dhe qartë - x86-64. Vendosja nuk shkakton ndonjë gabim (lidhja SSH e suksesshme dhe skedarët tekst të shkruar në RPi2 pa ndonjë problem) dhe as ekzekutimi i binareve (nëpërmjet Krijuesit Qt ose terminalit) në fletoren time. Megjithatë, një gjë tjetër që kam vënë re është se për disa arsye SFTP nuk po ngarkon binarin tim. Po, binar është me arkitekturë të pasaktë dhe unë nuk do të jem në gjendje ta ekzekutoj atë në RPi2 tim, por prapëseprapë duhet të ngarkohet apo jo?

Kam kontrolluar gjithashtu nëse për ndonjë arsye kam zgjedhur përpiluesin e gabuar duke përpiluar manualisht kryesoren time dhe duke prodhuar një binar:

:~$ arm-linux-gnueabihf-g++ main.cpp -o RPiCrossCompileRemoteTest_Manual

Mora një binar të bukur ARM, të cilin munda ta kopjoj dhe ta ekzekutoj në RPi2 tim. Më është shfaqur gjithashtu konfirmim shtesë nga dalja e file 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

Nuk e kam idenë se çfarë po bëj gabim. Kam ndjesinë se jam shumë, shumë afër që kjo gjë të funksionojë, por mjerisht! përpjekjet e mia për disa orë ishin të kota.

Ndihma vlerësohet shumë!

PS: Vini re se nuk e kam konfiguruar korrigjuesin tim. Kjo është diçka që planifikoj të bëj më pas pasi të fus në punë bazat dhe të lexoj më shumë rreth korrigjimit në distancë.


Përgjigjet:


1

Mirë, e kam funksionuar përpilimin. Problemi ishte në CMakeLists.txt. Ju duhet të specifikoni sistemin e synuar dhe përpiluesin. Qt Creator nuk e bën këtë automatikisht pasi i lexon të gjitha këto nga CMakeLists.txt megjithëse më bën të pyes veten se çfarë dobie ka përcaktimi i një komplete (së bashku me një përpilues dhe korrigjues të bashkuar me të) nëse do t'i bëni të gjitha me dorë gjithsesi . Ndoshta kjo funksionon vetëm kur përdorni projekte Qt. Do të duhet ta kontrolloni. Gjithsesi, këtu janë linjat që i kthyen gjërat:

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++)

Sa i përket ngarkimit nëpërmjet problemit SFTP, duket se dokumentacioni për QtCreatorDeployment.txt është shkruar në një mënyrë shumë konfuze. Kam vënë re se automatikisht bashkangjit rrugën rrënjësore të projektit. Ajo që bën në të vërtetë është larg kësaj. Thjesht e merr përsipër dhe e merr nga brenda. Pra, në thelb më mbeti vetëm shtegu i largët në skedarin tim të konfigurimit të vendosjes. u përpoqa

sftp://192.168.1.102/home/pi/Projects/

dhe nuk funksionoi. Sidoqoftë, nëse hiqni sftp-në dhe adresën IP, në të vërtetë funksionon sepse Qt Creator nxjerr automatikisht pjesën e adresës IP nga konfigurimi i pajisjes. Pra, QtCreatorDeployment.txt përfundimtar është vetëm kjo linjë e vetme (mund të shtoni shumëfish nëse dëshironi):

/home/pi/Projects/

Ja se si shfaqet në Qt Creator:

fut përshkrimin e imazhit këtu

  1. Kjo bëhet plotësisht automatikisht nga Qt Creator. Mund të jetë e mundur të ndryshohet, por në rastin tim funksionon mirë
  2. Kjo është ajo që nxirret nga QtCreatorDeployment.txt. Mënyra se si shfaqet është konfuze pasi mund të pritet që të shfaqet edhe adresa IP e pajisjes në distancë. Ende është atje për shkak të konfigurimit të pajisjes.

Kjo eshte! Tani mund ta vendos si duhet binarin tim ARM në sistemin në distancë.

16.08.2015
  • Faleminderit që e dokumentove kaq mirë këtë. Një gjë që lexova diku në udhëtimin tim në këtë fushë ishte se gjëja e preferuar për të bërë është përdorimi i një skedari Toolchain për të specifikuar cilësimet e ndër-përpiluesit. Fatkeqësisht, nuk kam qenë në gjendje të pajtohem si të bëj gjenerimin me Qt Creator dhe të tregoj skedarin e zinxhirit të veglave. 06.11.2017
  • Kur ekzekutoni cmake në projektin tuaj (punon gjithashtu nga brenda Qt Creator) ju duhet të kaloni -DCMAKE_TOOLCHAIN_FILE=<toolchain-file>.cmake. Brenda atij skedari mund të vendosni sistemin e skedarëve rrënjë, versionin e ndërthurur të Qt (nëse keni një të tillë), flamujt e ndërthurjes, cilësimet e mjedisit, cilësimet e lidhjes etj. Megjithatë kjo nuk ka të bëjë fare me QtCreatorDeployment.txt dhe është magji e pastër cmake. 06.11.2017
  • Dakord me -DCMAKE_TOOLCHAIN_FILE=‹something›.cmake. Si përfunduat duke e shtuar atë në hapin e gjenerimit të Qt Creator? A po modifikoni një parametër të kompletit ose po hyni në variablat CMake të Qt Creator (përfaqësimi i tij i cache-it CMake) dhe po vendosni CMAKE_TOOLCHAIN_FILE? 06.11.2017
  • Pra, në thelb -D... po i kalon një vlerë një ndryshoreje cmake (qoftë ajo e personalizuar apo ajo që ofron vetë cmake). Kështu që ju mund ta përcaktoni atë brenda CMakeLists.txt tuaj ose ta kaloni atë përmes magjistarit cmake (ose sido që të quhet) kur të ekzekutoni cmake në projektin tuaj nga brenda Qt Creator. Sigurisht nëse shtoni vlerën e skedarit të zinxhirit të veglave brenda CMakeLists.txt tuaj dhe nuk e kaloni atë si argument në komandën cmake, ai do të merret parasysh sa herë që ekzekutoni cmake. Kjo nuk është e dobishme nëse së pari kodoni dhe ekzekutoni aplikacionin tuaj në sistemin tuaj të devijimit dhe më pas e kompiloni atë. 10.11.2017

  • 2

    Ashtu siç sapo kalova ecjen time nëpër ferr duke u përpjekur të konfiguroja vendosjen e QtCreator bazuar në këtë pyetje (e cila ka shumë udhëzime përshkruese dhe të detajuara), dua t'i vë në dukje opsionin e mëposhtëm kujtdo që arriti ta lexojë këtë postim deri në këtu.

    Nuk është e nevojshme të përdoret Cmake për të vendosur automatikisht tragetet e ndërthurura. Qmake lejon të njëjtën mënyrë, madje edhe më të mirë, vendase, bazuar në variablin INSTALLS në skedarin .pro. Më shumë detaje mund të gjenden këtu

    13.10.2015
  • Asnjëherë nuk tha se cmake është e nevojshme. qmake siç e keni vënë re tashmë lejon një mënyrë shumë më të lehtë për të bërë gjërat. Megjithatë unë kam nevojë për mbështetje për cmake në këtë çështje, kështu që qmake nuk është një opsion për mua. Unë kam shumë projekte (përfshirë ROS (Robot Operating System)), ku është e vështirë/e pamundur të konvertohet në qmake. 14.10.2015
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..