2009-08-14 5 views
8

Использование Visual Studio 2008 и его компилятора C/C++, как создать DLL Win32, зависящую только от других DLL Windows, и не имеет зависимости от Время выполнения Microsoft C?Как создать DLL Win32 без зависимости от времени выполнения C

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

Для тех, кого он использует (например, memcpy), я рад переработать код для использования эквивалентов Win32 API (например, CopyMemory).

+0

CopyMemory не является функцией winapi, вам придется написать свой собственный – Anders

+6

Извините, что ударил старый поток, но 'CopyMemory' - это функция API: http://msdn.microsoft.com/en-us/library/ aa366535% 28VS.85% 29.aspx Кроме того, вместо этого '# define'd следует вызвать' memcpy'. – Thomas

ответ

10

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

статья Мэтта Pietrek от пути назад, когда на LIBCTINY будет, вероятно, всю информацию, вам нужно:

+0

В цитате из этой статьи «К счастью, мы прошли мимо тех дней, и в большинстве случаев вы можете полагаться на доступность MSVCRT.DLL на ваших целевых компьютерах». И Пьетрек предполагает, что вы должны так зависеть. – 2009-08-14 19:29:39

+0

И это * все еще верно *? Лоты изменились со времен Windows 2000. Думаю, теперь не так, что мы должны зависеть от MSVCRT на машине. По крайней мере, это сложнее, чем указано в заявлении Мэтта. – Cheeso

+2

Мы можем зависеть от MSVCRT.dll, находящегося на машине, но Visual C++ ссылки на MSVCRver.dll где ver 80, 90, 100, 110 и т. Д. – BCran

0

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

+3

Я думаю, что его справедливо предположить, что любые зависимости окон DLL будут иметь окна. Я не вижу твоей точки. –

+0

Если ваш код зависит от DLL, такой как ODBC32, то он косвенно зависит от CRT, который поставляется с Windows, - вы под ошибочным впечатлением, его нужно распределять отдельно? И если вы отклонили этот ответ, я должен спросить - почему? – 2009-08-14 18:38:03

+0

Если я создаю свой код с помощью компилятора microsoft C, я должен использовать поставляемую вместе с ним среду выполнения, если я хочу, чтобы они документировали/поддерживали поведение. Для этого требуется распространение указанного времени выполнения с моим кодом. Я полагаю, что я мог бы «обнаружить» еще одну Сработку С в Windows и каким-то образом динамически связать ее, но это гораздо больше работы, чем я имел в виду, особенно когда мне действительно не нужны какие-либо ее функции ... –

0

Скомпилируйте его со статическим microsoft lib.

+2

Как обсуждалось здесь: http://msdn.microsoft.com/en-us/library/abx4dbyh(VS.80).aspx Современная среда разработки microsoft C лучше не статически связана с DLL в системе, где другие библиотеки может использоваться среда выполнения C. –

0

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

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

5

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

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

О, и вместо того, чтобы перерабатывать memcpy, рассмотрите возможность использования сверхбыстрого compiler intrinsic. Вы можете включить intrinsics с/Oi.

+0

Я использую memcpy только в качестве примера. –

+1

Как я. Есть много встроенных встроенных компиляторов. –

+0

Это хорошая идея, но документируют ли они, что внутренняя среда компилятора не зависит от существования собственной среды выполнения C? Я предполагаю, что я мог бы проверить вывод компилятора, но это больше, чем я имел в виду ... –

4

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

Что вы хотите, это опция компилятора /Zl, «опустить имя библиотеки по умолчанию в .OBJ».

4

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

  1. Перейти к Project \ [Projectname] Свойства ...
  2. Открыть Свойства конфигурации
  3. Открыть C/C++
  4. Open Генерация кода
  5. Для Runtime Library Выбор Многопоточная Debug (/ МПД) вместо Multi- (/ MDd)

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

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

+0

Это работало для меня. Я не хотел удалять зависимость от MSVCRT, а скорее «ограничивал» дополнительные зависимости, которые могли вызвать ошибку «пропавшая зависимость». – Matthieu

Смежные вопросы