当我去制作C++应用程序时,我通常使用SDL或wxWidgets等库.但是,如果我要创建一个库,我是否需要使用库来创建一个库?或者我可以用核心C++代码制作整个库,这甚至可能吗?
是.
我的观点是,必须有一个点,一个库没有任何基础,因此它可以使用的唯一东西是核心C++.
没有.
C&C++是第三代语言的例子.因此,他们试图隐藏许多系统实现细节.下方的第三代编程语言(3GL)层是第二代编程语言(2GL),诸如x86汇编 ; 在这下面我们有机器代码说明.
正如josefx已经指出的那样,您确实可以在纯C++中实现C++库.但是,系统库(尤其是用于控制设备的系统库)可以并且通常以汇编程序编写.一般来说,库也可以用COBOL或Fortran甚至Brainfuck编写.
汇编器/编译器/链接器进程实际上将2GL/3GL代码转换为library可以在C++中链接的代码.
这是一个C程序的小例子blah.c,它链接到没有标准的运行时库,但它仍然设法使用*专有库中的函数打印出来的东西,libfoo.a, 写在x86 assembler:
/*-----------------------------------------------
blah.c
Invokes some assembly
------------------------------------------------*/
void _start()
{
char sz[]={"oOoook\n"};
foo(sz,sizeof(sz));
byebye();
}
Run Code Online (Sandbox Code Playgroud)
;----------------------------------------------------------------------------
;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内核); 顺便提一下,也可能由第三方实施.