![有没有在 64 位系统上构建 32 位项目的通用方法?](https://linux22.com/image/73985/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%9C%A8%2064%20%E4%BD%8D%E7%B3%BB%E7%BB%9F%E4%B8%8A%E6%9E%84%E5%BB%BA%2032%20%E4%BD%8D%E9%A1%B9%E7%9B%AE%E7%9A%84%E9%80%9A%E7%94%A8%E6%96%B9%E6%B3%95%EF%BC%9F.png)
我有一个应该在以下所有平台上运行的项目:
- 赢x86
- 赢 x64
- Linux (Debian) x86
- Linux (Debian) x64
我已经完成了 Windows 和 Linux x64 的编译,尽管我不确定它是否有效。缺少一个平台,那就是 Linux x86。我有一个不关心 x64/x32 的 makefile。我需要添加32位配置。我了解到我可以通过以下方式做到这一点make
:
make configuration CFLAGS=-m32
但我不太确定它是否确实进行了实际的 32 位构建 - 当我使用该命令时,没有发生编译1并且程序直接跳到链接阶段,它确实抱怨不兼容的库2:
/usr/bin/ld: cannot find -lboost_system
/usr/bin/ld: skipping incompatible /usr/lib//liblog4cplus.so when searching for -llog4cplus
/usr/bin/ld: skipping incompatible /usr/lib//liblog4cplus.a when searching for -llog4cplus
/usr/bin/ld: skipping incompatible /usr/local/lib/liblog4cplus.so when searching for -llog4cplus
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../liblog4cplus.so when searching for -llog4cplus
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../liblog4cplus.a when searching for -llog4cplus
/usr/bin/ld: skipping incompatible //usr/local/lib/liblog4cplus.so when searching for -llog4cplus
/usr/bin/ld: skipping incompatible //usr/lib/liblog4cplus.so when searching for -llog4cplus
/usr/bin/ld: skipping incompatible //usr/lib/liblog4cplus.a when searching for -llog4cplus
/usr/bin/ld: cannot find -llog4cplus
/usr/bin/ld: skipping incompatible /usr/local/ssl/lib//libcrypto.a when searching for -lcrypto
/usr/bin/ld: cannot find -lcrypto
这给习惯开发多架构程序的人提出了两个问题:
- 我应该如何管理图书馆?我必须手动构建它们吗?
- 如何正确制作makefile?我想 32 位版本和 64 位版本应该构建在不同的位置......
注1:我注意到这种情况发生是因为我没有make clean
。不过,64 位和 32 位不应该共享文件夹。
笔记2:这包括-lstdc++
- C++ 标准库。这意味着我什至没有那个。
答案1
您需要设置构建脚本,以便将不同体系结构的目标文件写入不同的目录。 Windows 对象和 Unix 对象之间自然不会发生冲突,因为它们使用不同的文件名(*.obj
和*.exe
与*.o
)*
,但 Unix 系统使用相同的文件名。
或者,将每个构建的源代码解压到不同的目录中。
关于库,您需要安装 32 位 ( …:i386
) 开发包以及本机 64 位开发包。或者,在 chroot 中设置 32 位安装,它使用几 GB 的磁盘空间,但维护成本非常低,并且是为您正在运行的发行版之外的其他发行版可靠地生成包的最简单方法。