Как связать .DLL статически?
У нас есть (чистый родной С++).DLL, который создается VS. В качестве клиентов у нас есть некоторые собственные С++-приложения и .Net-Wrapper вокруг этой DLL, написанной на С++/CLI. Наконец, есть некоторые клиентские приложения для .Net-Wrapper, написанные на С#.
Моя проблема в том, что native.dll должен быть распределен по-другому, чем работает мир .Net, и VS не отслеживает эту DLL.
Поэтому, чтобы все мои приложения С# работали правильно, я должен скопировать их в каждый исполняемый каталог или поместить его в% PATH% (чего я бы избегал на компьютерах разработчиков, поскольку они могут запускать разные приложения с различными версиями DLL).
Даже большие проблемы возникают, если есть UserControls, которые ссылаются на Wrapper-DLL: вам нужно скопировать DLL в каталог VS или снова в% PATH%.
Но худший случай возникает с нашим инструментом Translator. Этот инструмент отслеживает .Net-сборки и упаковывает их в пакеты-переводчики, которые могут быть отправлены внешнему переводчику. Насколько я знаю, нет возможности поместить в DLLL собственный .DLL!
Итак, я планирую связать собственную DLL статически с .Net-Wrapper, которая решит мои проблемы.
Но для наших собственных приложений эта родная DLL все равно должна быть DLL.
Итак, у меня есть два варианта:
- Сделайте два проекта (один, который генерирует статическую библиотеку, и тот, который создает динамический one = > я стараюсь избегать этого)
- Найти решение для связывания DLL статически
- Найдите способ, чтобы VS генерировал два выхода из одного проекта
Ответы
Ответ 1
В файле проекта С++ для dll создайте две конфигурации: одну, которая генерирует DLL, и одну, которая генерирует .lib. Два проекта не нужны, так как любой проект .NET/С++ может поддерживать несколько конфигураций сборки (это значит, что версии Release и Debug строятся по-разному).
Ответ 2
Другой вариант состоит в том, чтобы иметь два проекта, один проект будет выводить .lib, который может быть статически связан, и второй проект, который будет выводить .dll и будет иметь вашу .lib как зависимость, вы должны добавить .def к своему .dll с символами, которые вы планируете экспортировать, иначе он будет пустым.
Ответ 3
Возьмите копию DLL в Lib (Edit: Если вы не можете найти более дешевый вариант)
Ответ 4
Вы можете сгенерировать dll и экспортировать точку входа в lib с помощью dllexport
, это объясняется здесь.
http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx