两台计算机必须有什么共同点才能运行相同的可执行文件
What must two computers have in common to run the same executable?
我正在开发一个跨平台应用程序,我需要确定机器B是否能够运行在机器a上编译的应用程序。
我正在使用Qt,我已经知道我需要将Qt库与应用程序打包,或者针对Qt本身进行静态链接。
我也知道在Windows上编译的东西不能在Linux上运行。
然而,仍有一些其他矢量,我不确定它们在多大程度上重要。以下是我目前的理解总结:
影响可移植性
- 操作系统(Windows、Mac、Linux)
- 第三方库的可用性(Qt、静态与动态链接等)
可能影响便携性
- Linux风格(Ubuntu、Red Hat、Fedora)
- 体系结构(32或64位)
- 操作系统版本(Windows 7与Windows XP、Rhel5与Rhel6)
- 指令类型(i386、x64)
在可能影响便携性项目中,哪些项目实际会影响便携性?我缺了什么吗?
全部。至少有可能。
如果两台不同的机器没有二进制兼容性(例如。它们运行在不同的体系结构上,或者与不兼容的系统),则将无法创建将在两者上运行的单个二进制文件。(或者…跑步Linux上Wine下的Windows程序计数?)
否则,就要看情况了。你提到第三方图书馆:如果它们是动态加载的,它们必须在那里,但始终是静态链接,并且可能有一些方法可以使用动态库,这样它就会在那里。
32位与64位是体系结构的区别:32位程序将不会在64位环境中运行,反之亦然。但大多数现代系统将同时提供这两种环境如果,则它们在64位机器上。
操作系统的风格和版本等问题更为复杂。当然,如果您使用最近添加到操作系统中的任何功能,您将无法在以前带有操作系统的计算机上运行已添加。否则:低级别系统的主要原因动态加载库是为了支持转发和向后兼容性;我听说它并不总是有效的,但我怀疑任何问题都涉及一些罕见的功能。(这是有限度的。现代Windows程序不会在Windows95下运行,反之亦然。)
还有一个问题是,各种可选软件包已安装。Qt需要Linux下的X Windows或Solaris;我在很多Linux和Solaris设备上工作过它没有安装(甚至没有显示器设备)。
还有一个问题是,它是否会以可接受的方式运行。它可能在比测试的机器更小、更旧的机器上运行它,但它最终可能会像疯了一样寻呼,以至于变得不可用。
如果在64位处理器上编译应用程序,则默认情况下不会在32位处理器上运行。但是,您可以将选项传递给编译器,使其编译代码以在32位处理器上运行。例如,如果您在64位机器上使用GCC,如果您传递-m32
,它将编译32位代码。默认情况下,32位代码可以在64位计算机上运行。
来源
https://stackoverflow.com/a/3501880/193973
不同风格的Linux或操作系统版本可能有不同的系统库。例如,GetModuleFileNameEx
功能仅在Windows XP及更高版本中可用。不过,只要你注意自己使用的功能,就不会有太大问题。
x64体系结构与x86("32位")向后兼容,因此为x86编译的程序将在x64计算机上运行,但反之亦然。请注意,还有其他不太常见的体系结构,如ARM和PowerPC。
我可以立即想到三件影响可移植性的事情。但是,如果您的代码是两个系统都能理解的文件格式,两个系统也能理解的指令集,并且只让两个系统理解系统调用,那么您的代码可能应该在两个系统上运行。
- 可执行文件格式
- Windows了解PE、COFF、COM、PEF、.NET等
- Linux默认为ELF、OUT和其他
- MaxOSX使用Mach-O
- Linux也有运行Windows/Mac格式的扩展(Wine、Mono…)
- 指令集
- 每个处理器都有点不同,但是
- 通常有一个"最低公分母"可以作为目标
- 有时编译器会编写代码来执行两次函数
- 一个带有液晶显示器,一个带有"更快"的指令集
- 并且代码将在运行时选择正确的代码
- x64可以运行64位和32位,但不能运行16位
- x86可以运行32位和16位,但不能运行64位
- 操作系统调用
- 每个操作系统通常有不同的调用
- 这可以通过使用动态库而不是直接的操作系统调用来避免
- 比如…C运行库
- 或者.Net的CLR
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 代码在main()中运行,但在函数中出现错误
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何在运行中期切换GTK CSS style_context
- 如何在MS Visual Studio 2019中运行QT UI
- 如何通过cpp程序运行shell脚本
- IPC使用多个管道和分支进程来运行Python程序
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 在C应用程序中运行C++(带有STL)函数
- 运行程序时出现问题
- 控制允许动态运行c++的并发操作数
- 两台计算机必须有什么共同点才能运行相同的可执行文件