Зачем для статического импорта в Си и масме для каждой длл нужен либ файл, если в других ЯП импорт берется и прописывается в исходнике, например в делфи Оо или фасме
Имхо пережиток тех древних времён когда статическая линковка lib была основным методом, а динамическая являлась новомодной экзотикой, от которого M$ упорно не желает отказываться.
ну вообще в lib вложены декорированные имена - с кол-вом параметров и конвенцией вызова, т.е. мало-мальский контроль правильности.
Насчет больших проектов - есть Делфи, на ней тоже пишутся большие проекты, и в ней .lib файлов не предусмотрено. Догмой естественно тоже не предусмотрено. "декорированные имена - с кол-вом параметров и конвенцией вызова" - прописаны уже в экспорте длл, lib тут нипричем. Алсо контроль параметров осуществляется уже по прототипу функции в заголовочном файле.
с нуля я тоже без них писал, потом решил создавать собстенные, дабы придерживаться своих изначальных правил, которые заложил в ТЗ. В некотором плане либы учень помогают и экономят время компиляции. в либы ложатся OBJ-файлы, объявления прописуют в *.h, хотя все это чисто условно, всегда можно придумать что то свое в плане объявлений и прописаний. Но *.lib это погреб для нескольких obj. то же самое могу и про асм сказать.... даже каркас на нем писан...да, возможно пережитки старого, но мне нравится гибкость.
.lib файлы нужны для статического импорта. В них прописываются структуры, которые формируют таблицу импорта в исполняемом. В результате получается так, что link'еру не нужно выполнять какой-то особой работы при создании исполняемого. Исполняемый содержит ф-ии типа __imp_function_name в качестве импорта, а .lib экспортирует эти же имена и содержит переходники. У Питрека, это все описано.
думаю это всем и так понятно, только зачем это все если проще без этого? Вот допустим у меня есть компилятор, и допустим есть линкер (отдельный вопрос зачем нужен линкер). Я хочу написать прогу которая делает много замечательных вещей, и как любая нормальная прога, она должна юзать апи, а по-нормальному апи юзается через статический импорт. И тут выясняется, что мне зачем-то нужен .либ файл. А откуда его взять? А оказывается надо юзать какуюто хитрую прогу длл2либ чтобы сгенерить этот .либ файл из длл. А если длл нет, а есть только имя функции? Может на этом компе я буду только компилить прогу, а запускать на другом? Хрень какая-то получатся...
linker -- полезная вещь при компиляции больших проектов. Например, ядро FreeBSD компилировалось на моем компьютере 30 минут (примерно). Ближе к концу компиляции произошла ошибка из-за некорректного файла конфигурации. В итоге, если бы не было .obj файлов, пришлось бы снова ждать 30 минут. А так, большая часть независимых .obj уже была скомпилирована и исходники, от которых они зависели, не изменились. В итоге "докомпиляция" заняла минут 10, или даже меньше. Вот тогда я оценил наличие .obj файлов .
GoldFinch Вы считаете, что декларирование ф-ции как импортируемой из определённой DLL, лучше делать в исходниках? Минус такого подхода - негибкость. Например, мне нужно сделать свою реализацию части используемого WinAPI (хотя бы в виде переходников). Править хедеры SDK что ли? Для создания библиотеки импорта иметь саму DLL не обязательно - просто делаете def-файл с описанием нужных Вам ф-ций и генерируете lib-файл: Код (Text): lib.exe /def:DLL.def /out:DLL.lib Конечно, это немного сложнее чем в Delphi или VB. Но ведь по гибкости и универсальности эти языки не сравнить с C/C++.
Как правильно заметил Barbos В obj файла можно помещать код и переменные, а не только import/export. Но вообще без либ обойтись можно, но придется потратиться на время анализа исходных текстов. стандартные lib к MASM, TASM и C содержат import/export, но ни кто не мешает создать свои с кодом (допустим один раз написав алгоритм перевода int2str на MASM помещаем его в либ и используем или оставляем его в inc и тоже используем, кому как нравится).
Вопрос начинающего : делаем свои функции ( т.е - объекты или как они там называются в С) : _______________________ FUNC1 proc ... ..... FUNC1 endp FUNC1PROC proc .... ; обработчик сообщений для объекта FUNC1 ... FUNC1PROC endp _______________________________ ну и ещё несколько FUNC2, FUNC3... Теперь, если в начале программы вставить FUNC1 proto WORD,WORD,....... то всё прекрасно работает - invoke FUNK1, ..... ( или можно просто call FUNC1) Загорелось сделать библиотеку из этих функций - MYFUNC.lib Ктонить может доступно обьяснить - как? спасибо, просьба в гугль не посылать
Компилишь исходный текст - получаешь obj. Полученный obj добавляешь в lib. Как? , где lib - соответствующая утилита.
соответствующая утилита - можно подробней? и что "такое компилишь"? с какой стати компилятор выдаст объектный файл? надо шапку какую-то?
я пользуюсь масмом - значит компилятор от мелкософта но, сори, никогда не интересовался процессом... просто нажимаю в менюшке у МасмБилдера - "компилить" и ...