在Ubuntu 64位系统上编译32位程序,需要确保已经安装了支持32位编译的相关工具和库。这通常意味着安装 32 位版本的库和 GCC 多架构支持
1. 安装基本的32位开发环境:
#更新软件包列表
sudo apt update
#安装多架构支持
sudo dpkg --add-architecture i386
#安装 32 位库和 GCC 多架构支持
sudo apt install gcc-multilib g++-multilib
2. 安装您所需的库的 i386 版本
如果库存在i386开发包,可以这样做:
sudo apt install libmosquitto-dev:i386
sudo apt install libzlog-dev:i386
sudo apt install libmysqlclient-dev:i386
如果某个库不存在 i386 开发包,您可能需要从源代码手动编译它的 32 位版本。确保您在配置源代码时指定了正确的架构:
#如果是使用 configure 脚本的库,可以这样编译
./configure --host=i686-linux-gnu CFLAGS="-m32" CXXFLAGS="-m32" LDFLAGS="-m32"
make
sudo make install
#CMake构建
cmake . -DCMAKE_C_FLAGS=-m32 -DCMAKE_CXX_FLAGS=-m32
make
sudo make install
#仅Makefile构建,打开 Makefile 并找到设置编译器(CC)和链接器(LD)标志的部分
CFLAGS = -g -O2 -m32
LDFLAGS = -m32
3. 注:
如果编译的程序依赖32位的库,也可以将32位系统上已经安装成功的库文件与头文件拷贝到64位系统的环境中。
具体步骤实现:
1. 安装多架构支持:
首先,确保您的系统支持多架构安装:
sudo dpkg --add-architecture i386
sudo apt update
2. 安装32位依赖库:
安装32位版本的库和编译工具。对于大多数应用程序,您至少需要安装基本的C库和编译器:
sudo apt install libc6:i386 libncurses5:i386 libstdc++6:i386 gcc-multilib g++-multilib
3. 复制或克隆工控机环境代码:
如果您有对工控机的物理访问权限,可以直接复制相关代码;或者,如果代码托管在版本控制系统(如Git)中,可以克隆它。
4. 设置您的编译环境:
修改工控机代码的 Makefile
或 CMakeLists.txt
文件,以确保指定了 -m32
编译和链接标志。对于 cmake
,这通常意味着需要设置一些变量:
cmake .. -DCMAKE_C_FLAGS="-m32" -DCMAKE_CXX_FLAGS="-m32" -DCMAKE_SHARED_LINKER_FLAGS="-m32" -DCMAKE_EXE_LINKER_FLAGS="-m32"
5. 编译代码:
使用修改后的编译设置编译代码。这将生成32位的可执行文件和/或库。
6. 测试:
在64位机器上测试32位可执行文件可能会有问题,因为它可能需要32位版本的动态库。为了解决这个问题,您可以使用 chroot
环境或者容器化技术如Docker来测试,或者最好直接在目标设备上进行测试。
7. 使用 chroot(可选):
您可以使用 chroot
来创建一个完整的32位的环境。这可能比仅仅安装一些32位库更接近目标工控机的实际运行环境。使用 debootstrap
可以轻松创建一个 chroot
环境。
安装 debootstrap 工具:
sudo apt install debootstrap schroot
创建32位的 chroot 环境:
sudo debootstrap --arch i386 focal /path/to/chroot http://archive.ubuntu.com/ubuntu/
进入 chroot 环境:
sudo chroot /path/to/chroot
在 chroot 环境中,您将能够安装库和工具,并运行32位应用程序,就好像您在一个纯32位的系统中一样。
使用以上方法,您应该能够在64位系统上构建专门为32位工控机环境设计的软件。记住,完成编译后应该在实际的工控机硬件上对软件进行彻底测试,以确保一切正常。
注意:
在不同版本的ubuntu上编译的ELF文件所基于的内核版本可以不一致。
ubuntu20编译:for GNU/Linux 3.2.0
ubuntu16编译:for GNU/Linux 2.6.32
将为 GNU/Linux 3.2.0
编译的 ELF 文件放到 GNU/Linux 2.6.32
环境中运