win10子系统linux下cmake编译32位程序

文章目录

    • Ubuntu 18运行32位程序
      • 添加软件源
      • 安装编译环境
      • 编写CMakeLists.txt
      • cmake编译
      • 运行程序
    • SUSE 15.0运行32位程序
      • m32编译
      • 添加软件源
      • 安装qemu-linux-user

win10系统的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_outmain_out32位的,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位程序

m32编译

gcc -m32 test.c -o test

报错stud.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

你可能感兴趣的:(Linux)