当我去制作C ++应用程序时,我通常使用SDL或WxWidgets之类的库等等。但是,如果我要创建一个库,我是否需要使用库来创建一个库?或者我可以用核心C ++代码创建整个库,这甚至可能吗?
我的观点是,必须有一个点,一个库没有任何基础,因此它可以使用的唯一东西是核心C ++。
我对这个理论是对的吗?如果不是,那么低级库是如何制作的呢?
(我知道这是一个广泛的问题,但我是一个非常好奇的人,需要答案,这是困扰我的事情。)
答案 0 :(得分:17)
低级库通过操作系统提供的库访问硬件和系统资源。操作系统本身及其加载的驱动程序使用预定义内存地址的汇编和读/写来修改CPU状态并与硬件通信。
仅依赖C++的库只能是实用程序库,因为与硬件或用户的任何通信都涉及程序集或其他库。没有依赖关系的纯C ++库的示例是数学库,因为它不需要I / O或硬件访问。
答案 1 :(得分:7)
当我去制作C ++应用程序时,我通常使用SDL或wxWidgets等库。但是,如果我要创建一个库,我是否需要使用库来创建一个库?或者我可以用核心C ++代码创建整个库,这甚至可能吗?
是
我的观点是,必须有一个点,一个库没有任何基础,因此它可以使用的唯一东西是核心C ++。
没有
C&amp; C&amp; C ++是第三代语言的示例。因此,他们试图隐藏许多系统实现细节。 third-generation programming language(3GL)层的基础是second-generation programming language(2GL),例如 x86 assembly ;在这之下,我们有机器代码说明。就像已经pointed out by josefx一样,确实可以在纯C ++中实现C ++库。但是,系统库(尤其是用于控制设备的系统库)可以并且通常以汇编程序编写。通常,库也可以<{3}}或COBOL或甚至Fortran编写。
汇编器/编译器/链接器进程实际上将2GL/3GL
代码转换为可以在C ++中链接的library
。
这是一个C程序的小例子blah.c
,它链接到没有标准运行时库,但它仍然设法使用*专有库中的函数打印出来的东西,libfoo.a,
写在x86 assembler
:
/*-----------------------------------------------
blah.c
Invokes some assembly
------------------------------------------------*/
void _start()
{
char sz[]={"oOoook\n"};
foo(sz,sizeof(sz));
byebye();
}
;----------------------------------------------------------------------------
;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
$
可以看出,该库使用Brainfuck(在本例中为linux
内核);顺便提一下,也可能由第三方实施。
答案 2 :(得分:6)
SDL和wxWidgets是抽象底层系统细节的库。
要提供类似的功能(图形,声音,输入),您需要直接针对Windows上的Windows API,Mac OS X上的Cocoa以及Unix上直接针对{ {3}} API和POSIX(使用X11,XCB或原始X11协议。)
答案 3 :(得分:3)
有三种库:
执行系统调用的库通常不能用语言本身编写,因为它取决于系统调用约定的特殊性,通常涉及对内核进行陷阱或中断,导致切换到低privilege ring。纯C ++中没有设施来生成陷阱/中断; OS API通常使用程序集扩展来执行此操作。
第二类是制定或接收外国呼叫惯例的图书馆;可以说系统调用是其子类别,但系统调用明显不同,系统调用需要特权环切换,而外部调用则不然。外部调用约定通常也用汇编语言编写。
所有其他不涉及环切换或外部调用约定的库总是可以用C ++本身编写;虽然有时它们不是,但通常是出于性能目的(例如,数学库属于这一类)。
在任何情况下,属于前两类的库通常也有大量用纯C ++编写的代码,除了将系统调用/外部调用的API包装成C ++更熟悉的形式之外什么都不做工具和程序员(例如头文件和其他便利工具)。
答案 4 :(得分:1)
在核心,库只是类的集合。它们可以基于其他库来扩展它们或完全为新库提供核心。您可以使用C ++代码创建自己的库,例如,利用Windows API的图形库,扩展可用套接字库的聊天/通信库等。您说库是使用核心C ++是正确的功能。
答案 5 :(得分:0)
库只不过是可以链接代码的其他代码。他们没有什么神奇或特殊的东西。您可以使用已编写的函数将它们转换为库。所以问题实际上是你可以做低级别的东西只有C ++或者你还需要其他东西吗?那就是Lie Ryan的答案所在。你可以编写你的程序,做你的事情,只用C ++代码。您可以进行系统调用,并且您可以使用其他语言(例如程序集)来处理您在C ++中无法完成但需要执行的操作。
最后,这一切归结为机器代码和硬件。获得该机器代码或功能相同的所需或所需的任何语言或方法都在可能性范围内。也许并不总是最不可能使用asm或不使用系统调用等最明智的事情。
有大量的开源库与您正在谈论的类似,您只需查看代码即可了解它们是如何实现的。没有任何东西可以说一个实体实现某种东西的方式是唯一的方法。