所有与CPU有关的计算任务(OS也好,你自己的程序也好)最终都要转化为CPU的指令调用. CPU本身有它固有的指令集,CPU也只听命于它指令集范围内的指令. IBM-PC机的CPU指令系统大家在汇编语言课程中应有所接触了. 那么,有一点可以肯定的是,CPU接受指令工作是与OS无关的,不会因为在Windows下工作,跳转指令就 100101(假设),而在Linux下要用011010,这个层面(CPU工作)是远在OS层面以下的(即OS本身也是遵守CPU指令工作的).(btw,操作系统进行CPU调度是操作系统为了实现多任务进行的,不是你的程序指定的,所以与OS调度无关) 那么逻辑上说一条命令请求:计算1 + 1(假设是00101001010111111001),它是与平台无关的,只要是通过某种手段提交给CPU,CPU就应正常运作.
但实际的情况并没有1+1这么简单:
int main() { int a = 1 + 1; printf("%d\n",a); }
这段C代码可以在各个OS平台下正常编译得到相应的可执行文件
Linux:test_l
windows下test_w.exe
且都能正常工作. 但test_l和test_w 2个文件如果用工具比较的话,大不相同. why?
a. 因为一个可执行文件本身并不是仅仅包括对CPU的指令调用请求那么简单.还包括对全程序数据区,共享数据区,代码区的定义,程序中用到的字串需要在文件中存储,还要有对其它库调用信息的存储。因此一个可执行文件需要有一个结构,操作系统来解释这个结构,并按结构的定义分配内存,把代码加载到内存中的代码段,内存MAPPING,加载一些库...之后才是让CPU来执行此代码. 由上述,每个可执行文件都有自已的结构,这个结构也没有在业内形成统一标准(POSIX标准被WINDOWS支持如何?),就产生了不同的文件结构分类:WINDOWS下的COM 、MZ、NE、LE、PE... UNIX下的ELF COFF... 当然,这些不同结构的解释工作就归OS负责了。这一点就可以说明为什么在LINUX产生的ELF结构的可执行文件不可以被WINDOWS执行,也说明为什么GCC有for linux,还有for widnows的。
b.抛开从技术上讲可不可以让WINDOWS来执行ELF文件,还有一点就足以让一次编译,处处运行的愿望破灭(JAVA就不提它了,它的VM为什么有FOR WINDOWS和LINUX之分?)。因为程序除了自身的计算之外,很多工作是需要让OS来完成的,比如输出printf("%d\n",a); 原则上说你可以通过CMOS中断自已搞定(这也可以实现平台无关了),但一般都是调用操作系统现成的接口,类似的情况很多,在WINDOWS下叫它们API,在UNIX下叫SYSTEM CALL。对相关DLL或SO的调用信息也是写在可执行文件内部的,试问一个指定了要调用linux.so2的某个函数的可执行文件让WINDOWS如何来解决呢?
至此,剩下的只有感激了,感谢C标准委员会在WINDOWS平台和LINUX平台下使用stdio.h 中的打印函数都用printf(没有printf_for_win32 printf_for_linux64)之分,让开发者可以在一定范围内实现一次编写,到处编译(windows下和LINUX下printf的实现定是不同的了,但没人去关心它,编译器会自动帮你连接到合适的库)。
- 浏览: 499588 次
- 性别:
- 来自: 沈阳
最新评论
-
潇洒天涯:
[color=blue][color=cyan] ...
oracle 通过 nvl( )函数sql 查询时为 空值 赋默认值 -
hekai1990:
受教了..
oracle中的varchar2
相关推荐
其中,WINE( Wine Is Not an Emulator)是一个广为人知的开源项目,它提供了一个软件层,允许Linux用户直接在不依赖Windows操作系统的情况下运行某些Windows程序。尽管WINE已相当成熟,但并非所有Windows应用都能...
如果你想在Linux下运行Windows程序,Wine将是你必不可少的工具!WINE(WINdows Emulator)在X和UNIX之上的,Windows 3.x 和 Windows APIs的实现。它是一个Windows兼容层,通俗的讲,就是一个Windows模拟器。这个层即...
在Linux操作系统中运行Windows程序是许多用户面临的问题,尤其是那些依赖特定Windows应用的用户。...随着技术的发展,未来可能会有更高效、更兼容的解决方案出现,以满足用户在Linux环境下运行Windows程序的需求。
本篇将详细探讨如何在Linux和Windows环境下进行程序运行时间的检测。 首先,让我们从Linux环境开始。在Linux中,我们可以使用C++的标准库函数`<chrono>`来实现精确的时间测量。`std::chrono::high_resolution_clock...
也提供了一个程序加载器,该加载器允许不用任何修改Windows 3.1/95/NT的二进制文件,就可以运行在Intel Unix及其衍生版本下.Wine可以工作在绝大多数的UNIX版本下,包括Linux, FreeBSD, 和 Solaris. Wine不需要Microsoft...
Linux 下运行 Windows 程序 Wine Wine 是一个在 Unix/Linux 平台上运行的 Win32 API,允许用户在 Linux 上直接使用 Win32 软件,无需安装 Windows。...* Wine 支持在不同版本的 Windows 程序下运行
"Linux下的程序移植到Windows" Linux下的程序移植到Windows需要修改的地方是非常重要的,因为Linux和Windows是两种不同的操作系统,它们之间存在很多差异。因此,在移植程序时需要注意许多问题,本文将介绍其中的...
当然,虚拟机wmware也可以实现在linux下运行windows程序,但许要在linux上运行windows系统,浪费硬盘,运行两个系统速度超慢,而且能看到硬盘灯闪烁的厉害,对硬盘损耗极大。这款平台不需运行windows系统,就可以...
开发者在使用工具前应确保Linux工程中的所有依赖项都能在Windows环境下找到相应的版本。 总结来说,"linux c++工程转windows下c++工程工具"简化了跨平台开发的流程,利用CMake的灵活性和Visual Studio的强大功能,...
虽然大多数linux爱好者都不怎么使用Windows,但是不少人还是习惯了某些Windows...有没有什么办法,能在xterm下直接通过My Windows App.exe来运行这些程序?幸运的是,Linux内核特性binfmt_misc就够帮助你达成这个愿望。
在Linux系统中运行C#程序可能会让一些开发者感到陌生,因为C#主要与Microsoft的.NET框架和Windows操作系统关联。然而,随着.NET Core的发布,C#已经成为跨平台开发的重要选择,包括在Linux上。本资源提供了在Linux...
### Wine使用者指南:深入探索Linux下运行Windows程序 #### 概览与目的 Wine,一个开创性的软件,旨在让Linux用户能够在不依赖Windows操作系统的情况下,执行原生的Windows应用程序和游戏。它通过提供Windows API...
### Linux下运行Windows程序——以Fedora 14为例 #### 概述 在Linux环境中运行Windows程序的需求并不罕见,特别是在需要使用某些专为Windows设计的应用软件时。本篇文章将详细介绍如何在Fedora 14操作系统中利用...
2. **分析依赖库:**Windows程序通常依赖特定的库文件(例如:DLLs),这些库可能在Linux环境下不存在或版本不兼容。 3. **了解API差异:**Windows与Linux之间存在着大量的API差异,例如文件系统接口、网络编程接口...
在Windows操作系统上运行Linux程序可能看似不可能,但随着技术的发展,这一需求得到了满足。本文将深入探讨如何在Windows系统中实现这一目标,并提供一个实际的示例代码。 首先,我们需要了解的是,Windows与Linux...
### Wine使用教程:在Linux下运行Windows程序 #### 一、Wine简介 ...以上就是关于Wine的详细介绍,希望能帮助用户更好地理解和使用这个强大的工具,让在Linux环境下运行Windows程序变得更加便捷高效。
总之,这个资源为学习TCP Socket编程提供了宝贵的实践材料,无论是在Linux还是Windows环境下,都能帮助开发者掌握网络通信的核心技术。通过研究这些程序,可以加深对TCP协议和Socket接口的理解,为构建自己的网络...
《Windows程序运行于Linux系统的技术》这篇文章探讨了在Linux环境下运行Windows程序的技术挑战与解决方案。在当前的操作系统竞争中,Linux系统尽管在服务器领域取得了显著成就,但在桌面应用领域仍面临困难,主要...
WINE实际上是一个兼容层,它允许Windows API调用在Linux环境下被解释和执行,从而使得某些Windows程序能在不依赖Windows操作系统的情况下运行。然而,值得注意的是,WINE并不完美,有些应用程序可能无法正常运行或者...