文章目录

  • 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

win10子系统linux下cmake编译32位程序相关推荐

  1. 在64位linux下编译32位程序

    一般情况下我们最好是在一个平台上编译本平台的二进制程序,比如在32位平台上编译32位程序而在64位平台上编译64位程序. 现在64位的系统(这里主要指x86_64系统,包括AMD64和Intel的EM ...

  2. linux64下编译32位程序,报错

    linux64下编译32位程序 gcc -o xxx -m32 xxx.c 遇到问题 /usr/include/gnu/stubs.h:7:27: 致命错误:gnu/stubs-32.h:没有那个文件 ...

  3. 64位的GCC 编译32位程序

    64位的GCC 编译32位程序 编译32的程序,只需要加上-m32就可以了 gcc -m32 llong.c 但是提示下面的错误 /usr/bin/ld: 当搜索用于 /usr/lib/gcc/x86 ...

  4. 64位Ubuntu上编译32位程序

    1.确认主机为64位架构的内核,应该输出为adm64,执行: $ dpkg --print-architecture 2.确认打开了多支架功能,应该输出为i386,执行: $ dpkg --print ...

  5. 【工程项目经验】Centos 编译32位程序

    Centos下64位系统下编译32位程序时报错: /usr/bin/ld: cannot find -lgcc_s 解决办法: Script "build.sh" builds b ...

  6. Boost在Linux和windows下的编译 32位 64位

    一 简言 1. Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一 2. Boost官网地址:http://www.boost.org/ 3. 本博客示 ...

  7. 64ubuntu编译32位程序

    今天做实验,64位ubuntu,sizeof指针得到8 想编译成32位程序 百度 需要安装32位库,已经安装了 libc6 libc6-dev 报错fatal error: sys/cdefs.h: ...

  8. linux 64平台上编译32位程序: GCC编译选项 -m64 -m32 -mx32

    -m32选项将int,long和指针设置为32位,并生成在任何i386系统上运行的代码. -m64选项将int设置为32位和long,指针设置为64位,并为AMD的x86-64体系结构生成代码. -m ...

  9. linux 64 32 编译支持,在64位linux上编译32位程序 for i386 intel

    编辑中 # ld -V GNU ld version 2.15.92.0.2 20040927 Supported emulations: elf_x86_64 elf_i386 i386linux ...

最新文章

  1. Opencv java模板匹配-角点检测(11)
  2. 【技能提升】delegate为什么要用weak
  3. JavaScript触摸与手势事件
  4. springSide3
  5. Docker安装zookeeper 单节点安装
  6. integer加1_利用Abaqus UEL开发自定义单元1
  7. 三层交换(VLAN间互通+路由功能)+VTP+STP(PVST)综合实验(理论+实践=真实)
  8. 运维工程师如果将web服务http专变为https
  9. 算法训练营 重编码_编码训练营后如何找到工作
  10. javascript之继承
  11. LeetCode 116/117 填充每个节点下一个右侧指针
  12. 【sklearn第五讲】特征提取(上)
  13. Python核心编程--学习笔记--8--条件与循环
  14. 如何克服枯燥工作带来的单调感和厌烦感
  15. 中间件系列六 RabbitMQ之Topic exchange 用法
  16. idea如何恢复默认的keymap
  17. python学得好、进监狱进的快_最经典的100部美剧,看到第一名瞬间服气!
  18. 直播APP软件开发,直播系统开发的技术架构揭秘
  19. nmap渗透测试--版本探测
  20. contenttype类型php文件上传,php aws 文件上传设置content_type

热门文章

  1. 非线性方程求根方法总结附代码(从二分法、试位法到牛顿迭代、二次插值等)
  2. 基于第三方平台进行直播的搭建(附源码数据库)
  3. nuke 8.0v3 强劲的视觉特效合成软件 linux,Nuke8.0
  4. pyLDAvis3.3.1 报错 OSError: [Errno 22] Invalid argument: ‘https://cdn.jsdelivr.net/gh/bmabey/pyLDAvis@
  5. 商业php源码,Thinkphp内核2019全新UI威客任务平台网站商业原版源码
  6. Python实现正无穷 负无穷赋值
  7. torch学习 (三十二):周杰伦歌词数据集与长短期记忆 (LSTM)
  8. 拼多多网店批量发货软件,卖家必备发货助手,非常好用,免费7天
  9. box-shadow用法总结
  10. 2022NepCTF部分WP