底层库是如何建立的? 当我去做C++应用时,我一般使用类似或类似的库。但是如果我要建一个图书馆,我需要用图书馆来建图书馆吗?或者我可以用核C++代码来制作整个库,这是可能的吗? 我的观点是图书馆必须没有什么基础,所以它唯一可以使用的是核心C++。p>
我的理论对吗?如果不是,那么底层库是如何真正构建的底层库是如何建立的? 当我去做C++应用时,我一般使用类似或类似的库。但是如果我要建一个图书馆,我需要用图书馆来建图书馆吗?或者我可以用核C++代码来制作整个库,这是可能的吗? 我的观点是图书馆必须没有什么基础,所以它唯一可以使用的是核心C++。p>,c++,libraries,low-level,C++,Libraries,Low Level,我的理论对吗?如果不是,那么底层库是如何真正构建的 (我知道这是一个广泛的问题,但我是一个非常好奇的人,需要答案,这是困扰我的一件事。)最核心的是,图书馆只是类的集合。它们可以基于其他库进行扩展,也可以完全为新库提供核心。您可以使用C++代码创建自己的库,例如,利用Windows API的图形库、扩展可用的套接字库的聊天/通信库,你说图书馆使用核心C++功能是正确的。 < P> SDL和WxWIDGES是抽象底层系统细节的库。 要提供类似的功能(图形、声音、输入),您需要在Windows、Mac
(我知道这是一个广泛的问题,但我是一个非常好奇的人,需要答案,这是困扰我的一件事。)最核心的是,图书馆只是类的集合。它们可以基于其他库进行扩展,也可以完全为新库提供核心。您可以使用C++代码创建自己的库,例如,利用Windows API的图形库、扩展可用的套接字库的聊天/通信库,你说图书馆使用核心C++功能是正确的。 < P> SDL和WxWIDGES是抽象底层系统细节的库。
要提供类似的功能(图形、声音、输入),您需要在Windows、MacOSX和Unix上直接针对API和(使用或原始X11协议)编写代码。低级库通过操作系统提供的库访问硬件和系统资源。操作系统本身及其加载的驱动程序使用汇编和预定义内存地址的读/写来修改CPU状态并与硬件通信 仅依赖于的库只能是实用程序库,因为与硬件或用户的任何通信都可能涉及程序集或附加库。纯C++库中没有依赖项的示例将是一个数学库,因为它不需要I/O或硬件访问。p> <>我去做C++应用时,我一般使用SDL或WxWIDGET等库。但是如果我要建一个图书馆,我需要用图书馆来建图书馆吗?或者我可以用核C++代码来制作整个库,这是可能的吗? 对 我的观点是,图书馆必须没有什么基础,所以它唯一可以使用的是核心C++。 没有 < P> C++是第三代语言的例子。因此,它们试图隐藏许多系统方面的实现细节。在(3GL)层下面是一个(2GL),比如x86组件;下面是机器代码说明
已经这样,您可以在纯C++中实现C++库。然而,系统库(特别是那些用于控制设备的库)可以而且通常是用汇编语言编写的。一般来说,一个图书馆也可以写在或甚至
< >是汇编/编译器/链接器进程,实际上将blah.C
,它链接到no标准运行时库,但它仍然能够使用*专有库libfoo.a,
中的函数打印出内容,该库是用x86汇编程序编写的:
诸如此类:
foo.asm:
下面是它是如何建造的:
$ nasm -felf -ofoo.o foo.asm
$ ar rs libfoo.a foo.o
$ gcc -L. -oblah blah.c -lfoo -nostartfiles -nostdlib -nodefaultlibs
$ ./blah
oOoook
$
可以看出,该库使用了(在本例中,使用的是linux
内核);顺便提一下,也可以由第三方实施。有三种库:
执行系统调用的库
实现外部函数调用的库
可以在核心C++中编写或重写的库(例如,排除ASM扩展)
执行系统调用的库通常不能用语言本身编写,因为它取决于系统调用约定的特殊性,这通常涉及对内核进行陷阱或中断,从而导致切换到较低级别。在纯C++中没有产生陷阱/中断的工具;OSAPI通常使用程序集扩展来实现这一点
第二类是发出或接收外呼的库;可以说系统调用是其中的一个子类,但系统调用明显不同,系统调用需要特权环切换,而外部调用则不需要。外呼约定通常也写在汇编中
<>所有其他不涉及环开关或外挂调用约定的库都可以用C++本身编写;尽管有时并非如此,但通常出于性能目的(例如,数学库属于此类别)
无论如何,在前两类中的库通常也有大量的代码,这些代码是用纯C++编写的,除了把系统调用/外挂的API封装成C++工具和程序员(例如头文件和其他便利工具)更为熟悉的形式外,什么也不做。.
库只不过是可以链接代码的其他代码。它们没有什么神奇或特别之处。您可以将编写的函数转换为库。所以问题是,你能只做C++低级的东西,还是你需要别的什么东西?这就是Lie Ryan的答案。您可以编写程序,只需用C++代码就可以完成您的操作。您可以进行系统调用,并且可以使用其他语言(例如,汇编)来做不能在C++中做但需要做的事情。p>
最后,这一切归结为机器代码和硬件。任何想要或需要获得机器代码或功能相同的东西的语言或方法都在可能的范围内。不必要地使用asm或不使用系统调用等可能并不总是最明智的做法
有大量类似于o
;----------------------------------------------------------------------------
;Some foo assembly: exposes system write & exit
;----------------------------------------------------------------------------
SECTION .text
global foo
global byebye
foo:
push ebp
mov ebp,esp
mov edx, [ebp+12]
mov ecx, [ebp+8]
mov ebx,1
mov eax,4 ;syscall for __NR_write
int 0x80 ;service interrupt
mov esp,ebp
pop ebp
mov eax,0
ret
byebye:
mov ebx,0
mov eax,1 ;syscall for __NR_exit
int 0x80 ;service interrupt
ret
$ nasm -felf -ofoo.o foo.asm
$ ar rs libfoo.a foo.o
$ gcc -L. -oblah blah.c -lfoo -nostartfiles -nostdlib -nodefaultlibs
$ ./blah
oOoook
$