Как я создаю DLL Win32 без зависимости от времени выполнения C

Можно получить хвост как часть Cygwin.

8
задан John McAleely 14 August 2009 в 18:04
поделиться

7 ответов

Используйте параметр компоновщика / NODEFAULTLIB и (конечно) убедитесь, что у вас нет фактических зависимостей от среды выполнения. Вам также необходимо указать и определить свою собственную точку входа для DLL с помощью параметра компоновщика / ENTRY или, в качестве альтернативы, иметь собственную функцию точки входа, которая соответствует имени, ожидаемому компилятором / компоновщиком (для dll это _DllMainCRTStartup ).

В статье Мэтта Питрека из далекого прошлого, когда на LIBCTINY, вероятно, будет вся необходимая информация:

10
ответ дан 5 December 2019 в 06:38
поделиться

У вас может быть больше зависимостей от CRT, чем вы думаете. Он разрушает ресурсы, такие как локальное хранилище потоков, а инициализаторы глобальных классов запускаются CRT перед main ().

Рассмотрите возможность связывания со статической CRT, как кто-то сказал, и если вы действительно действительно не хотите, используйте / NODEFAULTLIB и / ENTRY, как сказал кто-то другой.

О, и вместо того, чтобы переделывать memcpy, подумайте об использовании для него сверхбыстрого встроенного компилятора . Вы можете включить встроенные функции с помощью /Oi.

5
ответ дан 5 December 2019 в 06:38
поделиться

Некоторые библиотеки Windows зависят от среды выполнения C (например, ODBC32.DLL) так что я думаю, что вы здесь ничего не скрываете. В любом случае, зачем вам это делать?

0
ответ дан 5 December 2019 в 06:38
поделиться

Вы Мне нужно было убедиться, что ни одна из используемых вами Win32 DLL не нуждается в среде выполнения C, иначе вы вернетесь к исходной точке. Статическая компиляция библиотеки DLL не имеет значения, если одна из библиотек Win32 зависит от среды выполнения C.

Единственный способ увидеть, как это работает, - это статически связать ВСЕ ваши зависимые библиотеки DLL (если это вообще возможно) с вашей DLL. Это, конечно, означает, что вам придется перекомпилировать, чтобы воспользоваться всеми обновлениями DLL.

1
ответ дан 5 December 2019 в 06:38
поделиться

Скомпилируйте его с помощью статической библиотеки Microsoft.

0
ответ дан 5 December 2019 в 06:38
поделиться

Флаг компоновщика / NODEFAULTLIB на самом деле не является правильным флагом. Он проигнорирует все библиотеки по умолчанию, включая другие, такие как uuid.lib .

Вам нужен параметр компилятора / Zl , "опустить имя библиотеки по умолчанию в .OBJ ".

4
ответ дан 5 December 2019 в 06:38
поделиться

для режима «Отладка» попробуйте следующее:

  1. Перейти к Проект \ [Имя проекта] Свойства ...
  2. Открыть Свойства конфигурации
  3. Открыть C / C ++
  4. Открыть Создание кода
  5. Для Библиотеки времени выполнения Выберите Многопоточная отладка (/ MTd) вместо Многопоточная библиотека отладки (/ MDd)

для режима «Release» выполните те же действия, за исключением выбора Многопоточный (/ MT) на последнем шаге.

Это вызовет любую функцию времени выполнения C, которая используется в вашем программа, которая будет статически связана с вашим двоичным файлом.

5
ответ дан 5 December 2019 в 06:38
поделиться