Используйте параметр компоновщика / NODEFAULTLIB и (конечно) убедитесь, что у вас нет фактических зависимостей от среды выполнения. Вам также необходимо указать и определить свою собственную точку входа для DLL с помощью параметра компоновщика / ENTRY или, в качестве альтернативы, иметь собственную функцию точки входа, которая соответствует имени, ожидаемому компилятором / компоновщиком (для dll это _DllMainCRTStartup
).
В статье Мэтта Питрека из далекого прошлого, когда на LIBCTINY, вероятно, будет вся необходимая информация:
У вас может быть больше зависимостей от CRT, чем вы думаете. Он разрушает ресурсы, такие как локальное хранилище потоков, а инициализаторы глобальных классов запускаются CRT перед main ().
Рассмотрите возможность связывания со статической CRT, как кто-то сказал, и если вы действительно действительно не хотите, используйте / NODEFAULTLIB и / ENTRY, как сказал кто-то другой.
О, и вместо того, чтобы переделывать memcpy, подумайте об использовании для него сверхбыстрого встроенного компилятора . Вы можете включить встроенные функции с помощью /Oi.
Некоторые библиотеки Windows зависят от среды выполнения C (например, ODBC32.DLL) так что я думаю, что вы здесь ничего не скрываете. В любом случае, зачем вам это делать?
Вы Мне нужно было убедиться, что ни одна из используемых вами Win32 DLL не нуждается в среде выполнения C, иначе вы вернетесь к исходной точке. Статическая компиляция библиотеки DLL не имеет значения, если одна из библиотек Win32 зависит от среды выполнения C.
Единственный способ увидеть, как это работает, - это статически связать ВСЕ ваши зависимые библиотеки DLL (если это вообще возможно) с вашей DLL. Это, конечно, означает, что вам придется перекомпилировать, чтобы воспользоваться всеми обновлениями DLL.
Скомпилируйте его с помощью статической библиотеки Microsoft.
Флаг компоновщика / NODEFAULTLIB
на самом деле не является правильным флагом. Он проигнорирует все библиотеки по умолчанию, включая другие, такие как uuid.lib
.
Вам нужен параметр компилятора / Zl
, "опустить имя библиотеки по умолчанию в .OBJ ".
для режима «Отладка» попробуйте следующее:
для режима «Release» выполните те же действия, за исключением выбора Многопоточный (/ MT) на последнем шаге.
Это вызовет любую функцию времени выполнения C, которая используется в вашем программа, которая будет статически связана с вашим двоичным файлом.