低级库是如何制作的?

Dav*_*son 17 c++ low-level libraries

当我去制作C++应用程序时,我通常使用SDLWxWidgets等库.但是,如果我要创建一个库,我是否需要使用库来创建一个库?或者我可以用核心C++代码制作整个库,这甚至可能吗?

我的观点是,必须有一个点,一个库没有任何基础,所以它可以使用的唯一东西是核心C++.

我对这个理论是对的吗?如果没有,低级库是如何制作的?

(我知道这是一个广泛的问题,但我是一个非常好奇的人,需要答案,这是困扰我的事情.)

jos*_*efx 17

低级库通过操作系统提供的库访问硬件和系统资源.操作系统本身及其加载的驱动程序使用预定义内存地址的汇编和读/写来修改CPU状态并与硬件通信.

仅依赖于C++的库只能是实用程序库,因为与硬件或用户的任何通信都将涉及程序集或其他库.没有依赖关系的纯C++库的示例是数学库,因为它不需要I/O或硬件访问.


vio*_*313 7

当我去制作C++应用程序时,我通常使用SDL或wxWidgets等库.但是,如果我要创建一个库,我是否需要使用库来创建一个库?或者我可以用核心C++代码制作整个库,这甚至可能吗?

是.

我的观点是,必须有一个点,一个库没有任何基础,因此它可以使用的唯一东西是核心C++.

没有.

C&C++是第三代语言的例子.因此,他们试图隐藏许多系统实现细节.下方的第三代编程语言(3GL)层是第二代编程语言(2GL),诸如x86汇编 ; 在这下面我们有机器代码说明.

正如josefx已经指出的那样,您确实可以在纯C++中实现C++库.但是,系统库(尤其是用于控制设备的系统库)可以并且通常以汇编程序编写.一般来说,库可以用COBOLFortran甚至Brainfuck编写.

汇编器/编译器/链接器进程实际上将2GL/3GL代码转换为library可以在C++中链接的代码.

这是一个C程序的小例子blah.c,它链接到没有标准的运行时库,但它仍然设法使用*专有库中的函数打印出来的东西,libfoo.a, 写在x86 assembler:

blah.c:

/*-----------------------------------------------
blah.c
Invokes some assembly
------------------------------------------------*/
void _start() 
{
    char sz[]={"oOoook\n"};
    foo(sz,sizeof(sz));
    byebye();
}
Run Code Online (Sandbox Code Playgroud)

foo.asm:

;----------------------------------------------------------------------------
;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
Run Code Online (Sandbox Code Playgroud)

以下是它的构建方式:

$ nasm -felf -ofoo.o foo.asm
$ ar rs libfoo.a foo.o
$ gcc  -L. -oblah blah.c -lfoo -nostartfiles -nostdlib -nodefaultlibs
$ ./blah
oOoook
$
Run Code Online (Sandbox Code Playgroud)


可以看出,库使用了系统调用(在本例中是linux内核); 顺便提一下,也可能由第三方实施.


gnu*_*nud 6

SDL和wxWidgets是抽象底层系统细节的库.

要提供类似的功能(图形,声音,输入),您需要直接针对Windows上的Windows API,Mac OS X上的Cocoa和Unix上的代码,直接针对POSIX API和X11(使用XCB,Xlib或原始X11协议).

  • @ RichardJ.RossIII我的意思是没有一流的界面.就像评论中所说的那样,"为了避免学习Objective-C,你现在必须学习Objective-C运行时的实现细节和C级API",这是垃圾. (2认同)