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_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位程序
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-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
win10子系统linux下cmake编译32位程序相关推荐
- 在64位linux下编译32位程序
一般情况下我们最好是在一个平台上编译本平台的二进制程序,比如在32位平台上编译32位程序而在64位平台上编译64位程序. 现在64位的系统(这里主要指x86_64系统,包括AMD64和Intel的EM ...
- linux64下编译32位程序,报错
linux64下编译32位程序 gcc -o xxx -m32 xxx.c 遇到问题 /usr/include/gnu/stubs.h:7:27: 致命错误:gnu/stubs-32.h:没有那个文件 ...
- 64位的GCC 编译32位程序
64位的GCC 编译32位程序 编译32的程序,只需要加上-m32就可以了 gcc -m32 llong.c 但是提示下面的错误 /usr/bin/ld: 当搜索用于 /usr/lib/gcc/x86 ...
- 64位Ubuntu上编译32位程序
1.确认主机为64位架构的内核,应该输出为adm64,执行: $ dpkg --print-architecture 2.确认打开了多支架功能,应该输出为i386,执行: $ dpkg --print ...
- 【工程项目经验】Centos 编译32位程序
Centos下64位系统下编译32位程序时报错: /usr/bin/ld: cannot find -lgcc_s 解决办法: Script "build.sh" builds b ...
- Boost在Linux和windows下的编译 32位 64位
一 简言 1. Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一 2. Boost官网地址:http://www.boost.org/ 3. 本博客示 ...
- 64ubuntu编译32位程序
今天做实验,64位ubuntu,sizeof指针得到8 想编译成32位程序 百度 需要安装32位库,已经安装了 libc6 libc6-dev 报错fatal error: sys/cdefs.h: ...
- linux 64平台上编译32位程序: GCC编译选项 -m64 -m32 -mx32
-m32选项将int,long和指针设置为32位,并生成在任何i386系统上运行的代码. -m64选项将int设置为32位和long,指针设置为64位,并为AMD的x86-64体系结构生成代码. -m ...
- 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 ...
最新文章
- Opencv java模板匹配-角点检测(11)
- 【技能提升】delegate为什么要用weak
- JavaScript触摸与手势事件
- springSide3
- Docker安装zookeeper 单节点安装
- integer加1_利用Abaqus UEL开发自定义单元1
- 三层交换(VLAN间互通+路由功能)+VTP+STP(PVST)综合实验(理论+实践=真实)
- 运维工程师如果将web服务http专变为https
- 算法训练营 重编码_编码训练营后如何找到工作
- javascript之继承
- LeetCode 116/117 填充每个节点下一个右侧指针
- 【sklearn第五讲】特征提取(上)
- Python核心编程--学习笔记--8--条件与循环
- 如何克服枯燥工作带来的单调感和厌烦感
- 中间件系列六 RabbitMQ之Topic exchange 用法
- idea如何恢复默认的keymap
- python学得好、进监狱进的快_最经典的100部美剧,看到第一名瞬间服气!
- 直播APP软件开发,直播系统开发的技术架构揭秘
- nmap渗透测试--版本探测
- contenttype类型php文件上传,php aws 文件上传设置content_type
热门文章
- 非线性方程求根方法总结附代码(从二分法、试位法到牛顿迭代、二次插值等)
- 基于第三方平台进行直播的搭建(附源码数据库)
- nuke 8.0v3 强劲的视觉特效合成软件 linux,Nuke8.0
- pyLDAvis3.3.1 报错 OSError: [Errno 22] Invalid argument: ‘https://cdn.jsdelivr.net/gh/bmabey/pyLDAvis@
- 商业php源码,Thinkphp内核2019全新UI威客任务平台网站商业原版源码
- Python实现正无穷 负无穷赋值
- torch学习 (三十二):周杰伦歌词数据集与长短期记忆 (LSTM)
- 拼多多网店批量发货软件,卖家必备发货助手,非常好用,免费7天
- box-shadow用法总结
- 2022NepCTF部分WP