win 10サブシステムlinux下cmakeコンパイル32ビットプログラム

9943 ワード

文書ディレクトリ

  • Ubuntu 18実行32ビットプログラム
  • ソフトウェアソースの追加
  • インストールコンパイル環境
  • CMakeListsを記述する.txt
  • cmakeコンパイル
  • 実行プログラム
  • SUSE 15.0実行32ビットプログラム
  • m 32コンパイル
  • ソフトウェアソースの追加
  • インストールqemu-linux-user
  • win 10システムのlinuxのインストールはここでは紹介しません.ここではサブシステム環境のcmakeコンパイル32ビットプログラムだけを紹介します.

    Ubuntu 18 32ビットプログラムの実行


    システム情報は、次のコマンドで表示できます.
    cat /etc/issue
    uname -a
    

    ソフトウェアソースの追加


    aptはソフトウェアをインストールする時にデフォルトのソースでインストールできないかもしれませんが、プロファイルに中科大、アリのソースを追加することができます.著者は菊工場のイントラネットなので、内部ソースしか使えません.
    プロファイルを開くには
    vi /etc/apt/sources.list
    

    ソースを追加:
    deb http://rnd-mirrors.huawei.com/ubuntu/ bionic main multiverse restricted universe
    deb http://rnd-mirrors.huawei.com/ubuntu/ bionic-backports main multiverse restricted universe
    deb http://rnd-mirrors.huawei.com/ubuntu/ bionic-proposed main multiverse restricted universe
    deb http://rnd-mirrors.huawei.com/ubuntu/ bionic-security main multiverse restricted universe
    deb http://rnd-mirrors.huawei.com/ubuntu/ bionic-updates main multiverse restricted universe
    deb-src http://rnd-mirrors.huawei.com/ubuntu/ bionic main multiverse restricted universe
    deb-src http://rnd-mirrors.huawei.com/ubuntu/ bionic-backports main multiverse restricted universe
    deb-src http://rnd-mirrors.huawei.com/ubuntu/ bionic-proposed main multiverse restricted universe
    deb-src http://rnd-mirrors.huawei.com/ubuntu/ bionic-security main multiverse restricted universe
    deb-src http://rnd-mirrors.huawei.com/ubuntu/ bionic-updates main multiverse restricted universe
    
    :
    apt-get update
    

    コンパイル環境のインストール


    cmakeをインストールするコンパイル環境:
    apt install gcc
    apt install g++
    apt install make
    apt install cmake
    

    CMakeListsを作成する.txt


    ソースディレクトリは次のとおりです.
  • helloworld – src – include – build – CMakeLists.txt

  • ソースコードはsrcフォルダの下に、ヘッダファイルはincludeの下に、CMakeListsを開く.txt、コンパイルスクリプトを作成します.
    cmake_minimum_required(VERSION 3.10.2)
    # Project name
    PROJECT(test_main)
    # Head file path
    INCLUDE_DIRECTORIES(
    	include
    )
    # Source directory: src/
    AUX_SOURCE_DIRECTORY(src DIR_SRCS)
    # Set environment variable
    SET(TEST_MAIN
    	${DIR_SRCS}
    )
    # Set Compiler,     32   
    SET(CMAKE_C_FLAGS "-m32")
    SET(CMAKE_CXX_FLAGS "-m32")
    
    # Set output binary path: bin/,      
    SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    
    # Add executable file: /bin/test_out,      
    ADD_EXECUTABLE(main_out ${TEST_MAIN})
    set_target_properties(main_out PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")
    
    #      : math library
    #TARGET_LINK_LIBRARIES(../bin/${PROJECT_NAME} libm.so)
    
    #        
    add_library(test_main SHARED ${DIR_SRCS})
    #        ,     
    add_library(test_main_static STATIC ${DIR_SRCS})
    
    #           
    set_target_properties(test_main_static PROPERTIES OUTPUT_NAME "test_main")
    #             ,  
    set_target_properties(test_main PROPERTIES CLEAN_DIRECT_OUTPUT 1)
    set_target_properties(test_main_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
    # VERSION      ,SOVERSION API  
    set_target_properties(test_main PROPERTIES VERSION 1.0 SOVERSION 1)
    

    cmakeコンパイル


    コンパイル後に生成されたファイルをbuildの下に格納するために、buildフォルダの下に入ってcmakeを実行してmakefileファイルを生成し、makeを実行します.
    cd ./build
    cmake ..
    make
    

    makeを実行するとエラーが発生する可能性があります.32ビットライブラリbits/libcheader.start.hが見つかりません.32ビットライブラリをインストールし、makeコンパイルmakefile生成プログラムを実行します.
    apt install gcc-multilib
    

    プログラムの実行


    生成されたプログラムはbuild/binフォルダの下にあり、名前はmain_outであり、main_outは32ビットであり、linuxは64ビットであるため、直接実行することはできない.32ビットプログラムの実行環境をインストールする必要があり、実行前に を保証する必要がある(service binfmt-support start)、inuxが再起動した後、サービスが閉じる可能性がある.
    sudo apt install qemu-user-static
    sudo update-binfmts --install i386 /usr/bin/qemu-i386-static --magic '\x7fELF\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xff\xff\xff\xff\xff\xff\xff'
    sudo service binfmt-support start
    

    次にmain_out:
    ./main_out
    

    SUSE 15.0 32ビットプログラムの実行


    m 32コンパイル

    gcc -m32 test.c -o test
    

    エラーメッセージh見つからない、インストール:
  • glibc-32bit
  • glibc-devel-32bit
  • glibc-devel-static-32bit

  • libgcc_が見つかりませんs.so.1と-lgcc、インストール:
  • libgcc_so.1
  • libgcc_so.1-32bit
  • gcc7-c+±32bit

  • ソフトウェアソースの追加

    zypper ar --refresh http://rnd-mirrors.huawei.com/opensuse/distribution/openSUSE-stable/repo/oss/ openSUSE-Oss
    zypper ar --refresh http://rnd-mirrors.huawei.com/opensuse/distribution/openSUSE-stable/repo/non-oss/ openSUSE-Non-Oss
    zypper ar --refresh http://rnd-mirrors.huawei.com/opensuse/update/openSUSE-stable/ openSUSE-update
    

    追加に成功したかどうかを確認します.
    zypper lr --detail
    

    他のソースが前面にある場合は、これらのソースを無効にします.
    zypper mr --disable 1
    

    qemu-linux-userのインストール

    zypper in qemu-linux-user
    

    32ビットプログラムを実行するには、次のコマンドを実行します.
    qemu-i386 filename
    
    qemu-i386binfmtレジスタに追加し、システムが自動的にqenu-i386を呼び出して32ビットプログラムを実行するようにルールを作成します.
    echo ":i386:M::\x7fELF\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00:\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xff\xff\xff\xff\xff\xff\xff:/usr/bin/qemu-i386:" > /proc/sys/fs/binfmt_misc/register
    

    一般的なファイルフォーマットは、qemu-binfmt-conf.shコマンドを実行することによってレジスタに直接書き込むことができるが、i386は書き込まれず、手動でルールを追加する必要がある.
    このルールを削除または変更するには、次の手順に従います.
    echo -1 >  /proc/sys/fs/binfmt_misc/register //    
    
    echo 1 0 >  /proc/sys/fs/binfmt_misc/register//       
    

    参照リンク:[1]https://en.opensuse.org/HCL:Chroot [2] https://en.wikipedia.org/wiki/Binfmt_misc