Должен ли я ссылаться на среду выполнения Visual Studio C статически или динамически?

StackOverflow https://stackoverflow.com/questions/787216

  •  16-09-2019
  •  | 
  •  

Вопрос

Я читал аргументы обеих сторон о том, следует ли статически или динамически ссылаться на библиотеку времени выполнения C в проектах Visual Studio, и я до сих пор не совсем уверен, что думать.

Мой проект использует некоторые сторонние библиотеки (Python, HDF5, Trilinos и Microsoft MPI), каждая из которых должна быть построена с использованием той же библиотеки времени выполнения, что и мой окончательный исполняемый файл (в противном случае их нельзя будет связать вместе).При статическом связывании каждая из этих библиотек будет содержать копию среды выполнения C.Я читал, что это может вызвать проблемы, поскольку окончательный исполняемый файл будет содержать несколько копий среды выполнения, ни одна из которых не может взаимодействовать друг с другом.Но разве компоновщик не будет жаловаться, если одни и те же символы будут определены многократно?

Я хотел бы избежать «DLL-ада», но меня беспокоят коварные ошибки, которые могут возникнуть из-за статического связывания нескольких копий среды выполнения.Я читаю что-то неправильно?

Кроме того, я использую Visual Studio 2005 и прочитал, что среда выполнения Service Pack 1 не имеет обратной совместимости.Означает ли это, что приложение, созданное без SP1, не будет работать на компьютере с библиотеками DLL SP1, даже если они имеют одинаковое имя (например,msvcr80.dll)?

Это было полезно?

Решение

Статическое связывание приведет к раздуванию всех ваших EXE-файлов и DLL и может привести к сбоям (например.если код в одной DLL вызывает функцию free() с указателем, выделенным функцией malloc() в другой DLL).

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

См. раздел «Развертывание DLL библиотеки Visual C++ как частных сборок» на странице http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx подробнее, но в основном ваше приложение выглядит так:

c:\Program Files\My App\MyApp.exe
c:\Program Files\My App\MyLibrary.dll
c:\Program Files\My App\Microsoft.VC80.CRT\Microsoft.VC80.CRT.manifest
c:\Program Files\My App\Microsoft.VC80.CRT\msvcr80.dll

Что касается вашего последнего вопроса: да, целевой машине для работы необходимы правильные версии исполняемых DLL, но, развертывая их как частные сборки, вы это гарантируете.

Еще одним преимуществом является то, что пользователи, не являющиеся администраторами, могут установить ваше приложение (не в Program Files, а в другом месте) — им не требуется разрешение на запись файлов в область WinSxS.

Другие советы

Единственный раз, когда вы получите несколько копий среды выполнения, — это когда вы статически связываете библиотеку с DLL — каждая DLL получит копию, как и exe-файл.Если они все статические библиотеки, а не DLL, все они будут связаны друг с другом, и все ваши библиотеки будут использовать одну и ту же среду выполнения.

Это работа компоновщика.

...Делайте это статически...попытки исправить DLL Hell не увенчались успехом...просто добавьте дополнительные 200 КБ к вашей установке с помощью статической связи.

Статические библиотеки не обязательно должны быть статически связаны с другими статическими библиотеками.Вам нужно только связать все статические библиотеки в вашем основном проекте.Таким образом, компилятор не будет жаловаться на несколько символов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top