2010-01-18 139 views
9

我只是想知道如何在C++中创建独立程序?你如何创建一个独立的C++程序?

编辑:独立我是指一个程序,不运行在托管的环境(如操作系统)。我希望我的程序成为计算机加载的第一个程序,而不是操作系统。

+2

定义“独立式”。你的意思是没有依赖外部库?对于什么操作系统和环境? – 2010-01-18 22:15:04

+0

独立式在?没有操作系统?没有动态库? – 2010-01-18 22:15:30

+0

@Josh Kelley:“独立式”是指一个基本上是第一个加载到计算机上的程序(例如操作系统)的程序。我知道大多数人在ASM中写了一个boot-strapper,但是我想知道是否可以用C++来完成它。 – 2010-01-18 22:16:28

回答

10

看一看这篇文章:

http://www.codeproject.com/KB/tips/boot-loader.aspx

你会需要一点汇编启动代码,让你尽可能的main(),但是你可以用C写的,其余++。如果您想在运行时创建对象,并且您希望在多个线程中创建自己的调度程序,则必须编写自己的堆管理器(新建/删除)。

2

即使有你的说明,答案是这取决于 - 确切的启动顺序取决于硬件 - 虽然有相当多的共同点。引导加载程序通常以绝对地址加载,并且它所包含的文件经常按照原样被存入内存。这意味着您不使用常规链接器,而是使用“链接定位器”。如果一个典型的链接器产生一个可执行文件准备重新定位和加载,定位器会生成一个已经设置为在一个确切地址运行的可执行文件,并且所有的重定位已经被应用。对于那些足够年老的人来说,它们通常非常像MS-DOS .COM文件。除此之外,它必须(当然)静态链接程序依赖的整个运行时 - 它不能依赖于类似于DLL或共享对象库的东西,因为要加载的代码那些还没有被装入。

2

谷歌一开始

另一个想法是先从嵌入式系统仿真器的嵌入式C++,例如Atmel的AVR网站有一个很好的IDE的仿真爱特梅尔AVR系统,并允许你建立的原始代码在C中,并将其加载到仿真CPU中,他们使用gcc作为工具链(我认为)

2

C++用于embedded systems programming,甚至用于编写OS内核。

通常在引导序列的早期至少有几个汇编指令。有几件事情更容易表达,或者可能有需要使用的CPU供应商的参考代码。

对于初始引导过程,您将无法使用标准库。没有例外,RTII,新/删除。它回到了“带班的C”。大多数人只是在这里使用C.

一旦你有足够的支持基础设施加载,你可以使用你可以移植的标准库的任何部分。

2

你需要的是提供了一个环境:

  • 一个工作的C库,或足够的它做你想要什么
  • ,你打算用C++运行时的部分。这是编译器特定的

除了任何其他库。如果你的平台上没有动态链接器(如果你没有操作系统,你可能没有链接器),那么你将不得不静态链接它。

实际上,这意味着链接一些小的C++运行库和一个适合您的平台的C库。然后你可以简单地编写一个独立的C++程序。

0

如果您使用的是BSD Unix,您可以链接到独立库。这包括磁盘和tty的基本IO系统。你的源代码看起来就像在Unix下运行一样,但二进制文件可以加载到裸机上。

5

看到这个页面:http://wiki.osdev.org/C++

它有一切必要措施,开始编写使用C++作为采用了比较流行的工具链的核心语言的操作系统。

此外这个页面应该被证明是非常有用的:http://wiki.osdev.org/C++_Bare_Bones。它几乎引导你进入操作系统的C++入口点。