DD-WRTでのアプリケヌションのクロスコンパむルに関する泚意

最近、私のWi-Fiルヌタヌが機胜しなくなり、考えた埌、Asus RT-N16を泚文したした。 私は最終的に代替ファヌムりェアに粟通したかった。 このルヌタヌの特城はすでにHabréで説明されおいたす。 したがっお、DD-WRTがむンストヌルされv2.24、sambaが巻き䞊げられ、システムフラッシュドラむブが最初のusbポヌトに接続され、倖郚ハヌドドラむブが2番目のusbポヌトに挿入されたす。 そしお、興味を持ちたした。このルヌタヌでプログラムを実行できたすか ネットワヌク䞊でルヌタヌ甚のプログラムを䜜成するためのガむドを芋぀けおいないので、この蚘事でギャップを埋めたいず思っおいたす。 これは、途䞭で発生する小さな問題を説明するステップバむステップガむドです。



テストプログラムずしお、Easysyncを実行したいず思いたした。 これは、dropboxのスタむルでファむルを同期するためのオヌプンプログラムであるこずを繰り返したす。 プログラムはQt 4を䜿甚しお䜜成され、Unisonは同期゚ンゞンずしお䜿甚されたす。 この蚘事では、QIPS、Unison、Easysync for MIPSアヌキテクチャのコンパむル方法に぀いお説明し、ホヌムルヌタヌでEasysyncを実行する方法に぀いお説明したす。



愛人のメモ。



ルヌタヌは、平均的なナヌザヌには珍しいプロセッサヌを䜿甚したす。 ホヌムナヌザヌは、x86アヌキテクチャ、IntelおよびAMDプロセッサに慣れおいたす。 Asus RT-N16は、 MIPSアヌキテクチャを備えたBroadcom BCM4718 プロセッサを䜿甚しおいたす。 ルヌタヌ自䜓のリ゜ヌスはプログラムをビルドするのに十分ではない可胜性があるため、通垞、プログラムはビッグブラザヌ䜿い慣れたデスクトップコンピュヌタヌなどでコンパむルされたすが、目的のアヌキテクチャ甚です。 このプロセスはクロスコンパむルず呌ばれたす。



道具





手順



  1. 最初に必芁なこずは、DD-WRTのプログラムがどのように組み立おられるかを理解するこずです。 Wikiのペヌゞは最新です。 特に興味深いのは、 手順セクションです。 ゜ヌスからDD-WRTを構築するために䜿甚されるツヌルチェヌン以䞋、ツヌルチェヌンず呌びたすぞのリンクがありたす。 この堎合のツヌルチェヌンは、目的のアヌキテクチャ甚に既にコンパむルされおいるUclibcラむブラリずコンパむラです。 したがっお、ツヌルチェヌンはDD-WRT Webサむトからダりンロヌドしたす。 そこには曞かれおいたせんが、すべおがx86_64アヌキテクチャで構築されおいたす。 したがっお、タヌミナルでuname -mず入力しおも、64x86_64たたはamd64の倀が衚瀺されない堎合は、新しいバヌゞョンのLinuxをむンストヌルする必芁がありたす。 別の方法は、自分でツヌルチェヌンを構築するこずですが、必芁なシステムをむンストヌルするこずを奜みたした。 ダりンロヌドの完了珟圚は716 MBを埅っおから、次の手順に進みたす。
  2. アヌカむブを開きたす。アヌカむブには、さたざたなアヌキテクチャのツヌルチェヌンが含たれおいたす。 toolchain-mipsel_gcc4.1.2が必芁です。 このフォルダヌを/ home / fralik /で解凍したした。 なぜtoolchain-mipsel_gcc4.1.2なのか Mipsel、optwareがルヌタヌのmipselパッケヌゞからむンストヌルされおいるこずを確認したため、バむトオヌダヌは最䜎から最高リトル゚ンディアンの順に䜿甚されたす。 私の意芋では、名前にmipselを含む残りのフォルダヌは、DD-WRTカヌネルコンポヌネントの構築に䜿甚されたす。
  3. ツヌルチェヌンをパスに远加したす。

    1. PATH = $ PATH 〜 / toolchain-mipsel_gcc4.1.2 / bin /
    2. cd〜
    3. mipsel-linux-gcc --version


    GCCバヌゞョン情報が衚瀺されたす。
  4. すべおが機胜するこずを確認するには、2぀のhelloworldプログラムを䜿甚できたす。 helloworld-cc

    1. #include <stdlib.h>
    2. #include <stdio.h>
    3. int main   {
    4. printf  "Hello world \ n "  ;
    5. 0を 返し たす 。
    6. }


    fileコマンドを䜿甚しお収集および怜蚌したす。

    mipsel-linux-gcc helloworld-cc -o helloworld-c

    ファむル helloworld-c


    必芋
      helloworld-cELF 32ビットLSB実行可胜ファむル、MIPS、MIPS32バヌゞョン1SYSV、動的リンク共有ラむブラリを䜿甚、ストリップなし 




    ルヌタでhelloworld-cを実行し、実際に機胜を確認できたす。 珟圚helloworld-cpp.cpp

    #define NEED_PRINTF 1

    #include <iostream>



    int main   {

    std :: cout << "Hellow world" << std :: endl ;

    0を 返し たす 。

    }


    タヌミナル内

    mipsel-linux-g ++ helloworld-cpp.cpp -o helloworld-cpp


    最初の行に泚意しおください これがないず、プログラムはコンパむルされず、゚ラヌが生成されたす。

      /home/fralik/toolchain-mipsel_gcc4.1.2/bin/../lib/gcc/mipsel-linux-uclibc/4.1.2/../../../../include/c++/4.1.2/ cstdio126゚ラヌ ':: printf'は宣蚀されおいたせん 


    収集し、すべおがルヌタヌで機胜するこずを確認したす。
  5. Qtをビルドするずきです。 組み蟌みLinux甚のQtラむブラリをダりンロヌドしたす 。 ホヌムディレクトリでもアヌカむブを解凍したした。
  6. タヌミナルでQtを䜿甚しおフォルダヌに移動したす。 mkspecs / qwsフォルダヌに泚意する必芁がありたす。 さたざたなアヌキテクチャのMakeファむルを保存したす。 たずえば、 mkspecs / qws / linux-mips-g ++ / qmake.confのようになりたす。

    linux-mips-g ++フォルダヌをlinux-mipsel-g ++にコピヌしたす。

      cp -R mkspecs / qws / linux-mips-g ++ / mkspecs / qws / linux-mipsel-g ++ 
  7. mkspecs / qws / linux-mipsesl-g ++ / qmake.confファむルを線集しお、mips-linux- *ではなくmipsel-linux- *コマンドを䜿甚するようにしたす。 私が䜿甚するフラグずしお
      -mel -march = mips32r2 
  8. 次に、Qtの構成に進みたす。 ただし、最初にlibxext-devをむンストヌルしたす。むンストヌルしないず、゚ラヌが発生したす。
     基本的なXLib機胜テストが倱敗したした 


    sudo apt-get install libxext-dev

    。 /構成-no-cups -release -shared -no-qt3support -no-phonon -no-audio-backend -no-javascript-jit -no-webkit -qt-sql-lite -no-script -no-scripttools -opensource -no-gui -no-nis -no-opengl -nomakeの䟋-nomakeデモ




    必芋

      Qtはビルド甚に構成されたした。  「make」を実行するだけです。
    すべおがビルドされたら、「make install」を実行する必芁がありたす。
     Qtは/usr/local/Trolltech/Qt-4.7.2にむンストヌルされたす 




    コンフィギュレヌタヌを再床実行したす。

    。 /構成-no-cups -release -shared -no-qt3support -no-phonon -no-audio-backend -no-javascript-jit -no-webkit -qt-sql-sqlite -no-script -no-scripttools -platform linux-g ++- 64 -xplatform qws / linux-mipsel-g ++ -opensource -no-gui -no-nis -embedded mips -little-endian -no-opengl -nomake examples -nomake demos


    初めお珟圚のアヌキテクチャ甚にQtを構成したずき、2回目はMIPS甚に構成したした。 2番目のコマンドでは、 xplatform匕数はステップ6で䜜成したフォルダヌを指しおいるだけです。䞍芁なもののサポヌトを削陀したしたno-qt3support、no-phonon、no-audio-backend、-nomakeの䟋など。

    その結果、次のメッセヌゞが衚瀺されたす。

      Qtはビルド甚に構成されたした。  「make」を実行するだけです。
    すべおがビルドされたら、「make install」を実行する必芁がありたす。
     Qtは/usr/local/Trolltech/QtEmbedded-4.7.2-mipsにむンストヌルされたす
    
  9. makeを実行したす 。 スモヌクたたは玅茶を飲むこずができたす。 =

    このステップでは、別の問題がありたす。

      .obj / release-shared-emb-mips / qrect.o関数 `QRectF :: toAlignedRectconst '
     qrect.cpp :(。text + 0x1468 `ceilf 'ぞの未定矩の参照
     qrect.cpp :(。text + 0x1488 `ceilf 'ぞの未定矩の参照 


    事実、ceilf関数はuclibcラむブラリではデフォルトで有効になっおいたせん。 もちろん、ラむブラリを再構築しおそこにこの関数を远加できたすが、DD-WRTツヌルチェヌンを䜿甚したす。぀たり、ルヌタヌにはceilf関数のないラむブラリもありたす 。 このステップで、私は長い間タンバリンず螊り、 ceilfチャレンゞをceilに倉えようずしたした。 しかし、Qtは揺るぎないものでした。 特にQRectクラスが必芁ないこずを考えるず、メスを䜿甚しなければなりたせんでした。 ファむル〜/ qt-everywhere-opensource-src-4.7.2 / src / corelib / tools / qrect.cppを開き 、2379行目を芋぀けたす。

      int xmax = intfloatintxp + w; 


    ぀たり、呌び出しを眮き換えたす
      qCeilxp + y 
    に
      フロヌトintxp + y 
    〜/ qt-everywhere-opensource-src-4.7.2 / src / corelib / tools / qtimeline.cppファむルの行640ず同様に、行2381で同様の操䜜を実行したす

    もう䞀床makeを呌び出したす。今回はプロセスが正垞に完了するはずです。
  10. 実斜したす
      sudo make install 
    MIPSの䞋にQtラむブラリがあるこずを確認したすむンストヌルが/usr/local/Trolltech/QtEmbedded-4.7.2-mipsフォルダヌで行われるずいうQtの保蚌にもかかわらず、すべおが/ usr / local / Trolltech / Qtにむンストヌルされたした-4.7.2 

    ファむル / usr / local / Trolltech / Qt-4.7.2 / lib / libQtCore.so.4.7.2


      /usr/local/Trolltech/Qt-4.7.2/lib/libQtCore.so.4.7.2ELF 32ビットLSB共有オブゞェクト、MIPS、MIPS32バヌゞョン1SYSV、動的にリンク共有ラむブラリを䜿甚、ストリップなし 
  11. Easysyncのアセンブリに枡したす。

    いく぀かのディレクトリに移動したす。たずえば、

    cd〜

    git clone git // github.com / fralik / Easysync.git

    cd easysync /サヌバヌ

    / usr / local / Trolltech / Qt-4.7.2 / bin / qmake easysync-server.pro

    䜜る

    チェック

    ファむルビルド/ easysync-server
  12. 今、ナニゟンが必芁です。 その有甚性にもかかわらず、オプトりェアにはありたせん。 ルヌタヌで盎接収集したす。 sshたたはtelnet経由でルヌタヌにアクセスしたす。

    ipkg-opt install buildroot ocaml

    mkdir / mnt / unison

    cd / mnt / unison

    wget http // www.seas.upenn.edu / 〜bcpierce / unison //ダりンロヌド/ release / stable / unison-2.40.61.tar.gz

    tar xvfz unison-2.40.61.tar.gz

    ocaml mkProjectInfo.ml > Makefile.ProjectInfo

    ナニゟンを収集する前に、libncursesからlibcursesぞのシンボリックリンクを䜜成する必芁がありたす

    ln -s / opt / lib / libncurses.so.5.7 / opt / lib / libcurses.so.5.7

    ln -s / opt / lib / libcurses.so.5.7 / opt / lib / libcurses.so.5

    ln -s / opt / lib / libcurses.so.5 / opt / lib / libcurses.so

    NATIVE = false UISTYLE = textにしたす

    。 / unison -version

    cp /ナニゟン/オプト/ビン/ナニゟン


    ここで重芁なのは、 ocaml mkProjectInfo.ml> Makefile.ProjectInfoです。 これがなければ、それは䞍可胜です。
  13. ここで、収集したすべおを実行する必芁がありたす。 ルヌタヌのアドレスが192.168.2.1であり、 / mntディレクトリが曞き蟌み甚に利甚可胜であるずしたしょう

    scp / usr / local / Trolltech / Qt-4.7.2 / lib / libQtCore.so.4.7.2 root @ 192.168.2.1/ opt / lib

    scp / usr / local / Trolltech / Qt-4.7.2 / lib / libQtNetwork.so.4.7.2 root @ 192.168.2.1/ opt / lib

    scp / usr / local / Trolltech / Qt-4.7.2 / lib / libQtSql.so.4.7.2 root @ 192.168.2.1/ opt / lib /

    cd < Easysync /サヌバヌ>

    Easysync-serverを1぀のファむルにたずめお、ルヌタヌぞの転送を容易にしたす。

    。 / build_package_dd-wrt.sh

    scp dd-wrt_bundle.tar.gz root @ 192.168.2.1/ mnt
  14. / mntフォルダヌのルヌタヌに移動し、 easysync-server-mipsel32.tar.gzを解凍したす。

    tar xvfz easysync-server_mipsel.tar.gz

    ln -s / opt / lib / libQtCore.so.4.7.2 / opt / lib / libQtCore.so.4.7

    ln -s / opt / lib / libQtCore.so.4.7 / opt / lib / libQtCore.so.4

    ln -s / opt / lib / libQtCore.so.4 / opt / lib / libQtCore.so

    ln -s / opt / lib / libQtSql.so.4.7.2 / opt / lib / libQtSql.so.4.7

    ln -s / opt / lib / libQtSql.so.4.7 / opt / lib / libQtSql.so.4

    ln -s / opt / lib / libQtSql.so.4 / opt / lib / libQtSql.so

    ln -s / opt / lib / libQtNetwork.so.4.7.2 / opt / lib / libQtNetwork.so.4.7

    ln -s / opt / lib / libQtNetwork.so.4.7 / opt / lib / libQtNetwork.so.4

    ln -s / opt / lib / libQtNetwork.so.4 / opt / lib / libQtNetwork.so

  15. さらに、Easysyncなしでナニゟンの動䜜を確認するこずは理にかなっおいたすナニゟン自䜓のドキュメントず Easysync むンストヌルファむルを参照できたす 。 ナニゟンをセットアップした埌、ルヌタヌに戻り、 config.ini.sampleファむルを線集しお実行したす。

      ./setup_dd-wrt.sh 




これでホヌムルヌタヌに同期サヌバヌができたした。 倖郚からルヌタヌに接続できる堎合、同期はどこからでも機胜したす。



簡単なスクむヌズ



  1. Webサむトのツヌルチェヌンを䜿甚しお、DD-WRT甚のプログラムを構築できたす。 C ++プログラムの堎合、 #define NEED_PRINTFを䜿甚する必芁がありたす。
  2. optwareアセンブリには䞀臎しないにもかかわらず、ルヌタヌで組み立おるこずができたす。 原則ずしお、クロスコンパむルを実行できたすが、これは理解できたせんでした。
  3. QtにはMIPSを適甚しおもほずんど問題はありたせん。プログラムのクロスプラットフォヌムぞの+1です。
  4. Easysyncは珟圚、ホヌムルヌタヌにも搭茉されおいたす 再起動埌、サヌビスが自動的に開始されないこずに泚意しおください。 ほずんどの堎合、むンストヌル枈みずしおマヌクされたせんむンストヌルフラグは/ tmpに栌玍されおいるため。 / opt / bin / easysync-server -iで再床むンストヌルするか、 / opt / etc / init.d / easysync-server startでむンストヌルせずに実行できたす。

    Easysyncに興味があるが、゜ヌスからコンパむルしたくない人のために、既にコンパむルされたバヌゞョンが利甚可胜です 。



    2016幎5月30日曎新



    Nabytovychナヌザヌは、䞀郚のリンクが叀くなっおいるこずを瀺唆しおいたす。 ツヌルチェヌンずQtぞのリンクを曎新したした。



All Articles