Когда я иду и делаю приложение на C++, я обычно использую такие библиотеки, как SDL или wxWidgets и так далее. Но если бы мне нужно было создать библиотеку, нужно ли было бы мне использовать библиотеку для создания библиотеки? Или я могу сделать всю библиотеку из основного кода C++, это вообще возможно?
да.
Я хочу сказать, что должна быть точка, в которой библиотеке не на чем основываться, и поэтому единственное, что она может использовать, — это ядро C++.
No.
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();
}
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
И вот как он устроен:
$ nasm -felf -ofoo.o foo.asm
$ ar rs libfoo.a foo.o
$ gcc -L. -oblah blah.c -lfoo -nostartfiles -nostdlib -nodefaultlibs
$ ./blah
oOoook
$
Как видно, библиотека использует системные вызовы (в данном случае к ядру linux
); которые, кстати, также могут быть реализованы третьими лицами.
person
violet313
schedule
27.05.2012
std::fstream
,std::exit
). - person CB Bailey   schedule 27.05.2012c
, такие какgcc
, написаны в основном наc
;) - person violet313   schedule 27.05.2012<fstream>
поверх Win32CreateFile
,ReadFile
,WriteFile
API или даже поверх Cfopen
,fread
и т. д. - person CB Bailey   schedule 27.05.2012--disable-build-[poststage1-]with-cxx
не сработает. - person   schedule 27.05.2012stdio
(поскольку библиотека C является частью библиотеки C++, вы можете возразить, что на самом деле это не зависимость от другой библиотеки). Таким образом, обычная последовательность вызовов для ввода/вывода следующая: C++ → C → операционная система, где часть операционной системы — это C stdio → функции ввода/вывода POSIX → системный вызов → ядро в Linux и C stdio → Windows API → собственный API → системный вызов. → ядро в Windows. - person Philipp   schedule 27.05.2012