Здравствуйте, Евгений Музыченко, Вы писали:
У>>Ну как же нет, когда всё, что нужно, там есть?
ЕМ>Где там границы функций и модулей?
А они точно нужны? Без них никак?
У>>Теоретически можно разобрать ручками dll, покурить формат obj файлов MSVS и собрать всё в OBJ.
ЕМ>И получится линкуемый бинарник, но никак не библиотека.
Библиотека содержит объектники. Может содержать и один. Объектник содержит секции. Если ты не указал в настройках помещать каждую функцию в отдельную секцию, то код каждой единицы трансляции будет лежать в одной секции, которая при линковке будет подсосана целиком.
Вопрос был как слинковать DLL статически, а назовешь ты это библиотекой или линкуемым бинарником — какая разница-то?
Здравствуйте, удусекшл, Вы писали:
ЕМ>>Где там границы функций и модулей? У>А они точно нужны? Без них никак?
Чтобы тупо прикрутить DLL внутрь EXE — не нужны, только зачем это может быть нужно?
У>Библиотека содержит объектники. Может содержать и один. Объектник содержит секции. Если ты не указал в настройках помещать каждую функцию в отдельную секцию, то код каждой единицы трансляции будет лежать в одной секции, которая при линковке будет подсосана целиком.
Так делаются только самые тупые библиотеки, единственной задачей которых является столь же тупое прикрепление к конечному бинарнику. Правильная библиотека делается так, чтобы извлекать оттуда только необходимые зависимости, и ничего лишнего.
У>Вопрос был как слинковать DLL статически
Вопрос был, как переделать DLL в статическую библиотеку. Поскольку ТС традиционно сверхлаконичен, я предположил, что ему нужна классическая библиотека (контейнер для функций и модулей), а не формально линкуемый неразборный кусок.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>>>Где там границы функций и модулей? У>>А они точно нужны? Без них никак?
ЕМ>Чтобы тупо прикрутить DLL внутрь EXE — не нужны, только зачем это может быть нужно?
Чтобы тупо прикрутить DLL к EXE
ЕМ>Так делаются только самые тупые библиотеки, единственной задачей которых является столь же тупое прикрепление к конечному бинарнику. Правильная библиотека делается так, чтобы извлекать оттуда только необходимые зависимости, и ничего лишнего.
Тупая не тупая, но всё равно — библиотека
У>>Вопрос был как слинковать DLL статически
ЕМ>Вопрос был, как переделать DLL в статическую библиотеку.
Ок, согласен
ЕМ>Поскольку ТС традиционно сверхлаконичен, я предположил, что ему нужна классическая библиотека (контейнер для функций и модулей), а не формально линкуемый неразборный кусок.
Здравствуйте, удусекшл, Вы писали:
ЕМ>>Чтобы тупо прикрутить DLL внутрь EXE — не нужны, только зачем это может быть нужно?
У>Чтобы тупо прикрутить DLL к EXE
Ну вот я и не понял, для чего это могло бы понадобиться.
У>Тупая не тупая, но всё равно — библиотека
Как обычная библиотека с книгами, где на просьбу выдать один экземпляр предлагают забрать весь стеллаж.
Честно, не понял проблемы. Чем линковка "одним куском" хуже? И что такое "полноценная библиотека"?
Вот есть у нас заголовочный файл с API, функции которого можно вызывать из своего кода. В случае статической библиотеки они будут публичными в obj-файлах, в случае динамической — в её экспорте. В обоих случаях мы используем то, что нам предоставили.
Здравствуйте, flаt, Вы писали:
F>Чем линковка "одним куском" хуже?
Тем, что библиотека используется в роли единичного объектного файла.
F>И что такое "полноценная библиотека"?
"Библиотека" — это "хранилище книг". Множества книг, из которых можно выбрать нужное подмножество, а не одного гигантского фолианта из сотен тысяч страниц.
F>Вот есть у нас заголовочный файл с API, функции которого можно вызывать из своего кода. В случае статической библиотеки они будут публичными в obj-файлах, в случае динамической — в её экспорте. В обоих случаях мы используем то, что нам предоставили.
Если API состоит, грубо говоря, из сотни функций, а программа использует двадцать, то при линковке с грамотно сделанной статической библиотекой (ну, или при использовании современных расширений вроде packaged functions), будут прилинкованы только эти два десятка. DLL будет содержать всю сотню, но ее одновременно могут использовать несколько приложений. А при линковке "одним куском" к каждому приложению будет прицеплена вся сотня, и восемь десятков будет там лежать мертвым, бесполезным грузом.
Здравствуйте, удусекшл, Вы писали:
ЕМ>>Где там границы функций и модулей? У>А они точно нужны? Без них никак?
Точно нужны, но и этого недостаточно. Линкер может объединить в dll хвосты нескольких процедур/функций в один. Код процедуры может не составлять непрерывный кусок секции и пр.
ЕМ>Если API состоит, грубо говоря, из сотни функций, а программа использует двадцать, то при линковке с грамотно сделанной статической библиотекой (ну, или при использовании современных расширений вроде packaged functions), будут прилинкованы только эти два десятка. DLL будет содержать всю сотню, но ее одновременно могут использовать несколько приложений. А при линковке "одним куском" к каждому приложению будет прицеплена вся сотня, и восемь десятков будет там лежать мертвым, бесполезным грузом.
Это всё верно, вот только отвечал я на другое (черезчур категоричное) заявление:
Нельзя. DLL — это, как и EXE, конечный исполняемый файл, в нем нет имен, модулей, функций и прочих принадлежностей OBJ/LIB.
Здравствуйте, sergey2b, Вы писали:
S>статическую библиотеку S>или из файлов .o собранных cygwin файлы lib коректно линкуемые к проекту на VS
Главный вопрос, а зачем? Какая цель преследуется? Когда генерируется dll с ней можно флагом компилятора указать сгенерировать библиотеку линковки.
Еще тело dll можно упаковать как данные, которые грузит в память статическая либа. Только какой в этом смысл?
Только цель какая? Может тот кто поставил задание хочет другое? Например чтобы CRT в dll линковался статически, а не использовался динамически? Так это опять опция сборки dll.