win 10サブシステムlinux下cmakeコンパイル32ビットプログラム
9943 ワード
文書ディレクトリ
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
ソースディレクトリは次のとおりです.
ソースコードは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見つからない、インストール:
libgcc_が見つかりませんs.so.1と-lgcc、インストール:
ソフトウェアソースの追加
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-i386
をbinfmt
レジスタに追加し、システムが自動的に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