Как связать .DLL статически? - PullRequest
23 голосов
/ 08 января 2009

У нас есть (чистый нативный C ++) .DLL, созданный VS. В качестве клиентов у нас есть несколько собственных приложений C ++ и .Net-Wrapper вокруг этой DLL, написанной на C ++ / CLI. Наконец, есть несколько клиентских приложений для .Net-Wrapper, написанных на C #.

Моя проблема заключается в том, что native.dll должен распространяться не так, как мир .Net, а VS не отслеживает эту DLL. Поэтому, чтобы все мои приложения на C # работали правильно, я должен скопировать его в каждый исполняемый каталог или поместить его где-нибудь в% PATH% (чего я бы не хотел использовать на компьютерах разработчиков, поскольку они могут захотеть запускать разные приложения с разными версиями DLL). Еще большие проблемы возникают, если существуют UserControls, которые ссылаются на Wrapper-DLL: Вы должны скопировать DLL в каталог VS или снова в% PATH%. Но худший случай происходит с нашим инструментом Переводчик. Этот инструмент отслеживает .Net-сборки и упаковывает их в пакеты-переводчики, которые можно отправить внешнему переводчику. Насколько я знаю, нет никакого способа поместить нативный .DLL в этот пакет!

Так что я планирую статически связать нативную DLL в .Net-Wrapper, что решит мои проблемы. Но для наших родных приложений эта нативная DLL должна быть DLL.

Так что у меня есть два варианта:

  • Сделайте два проекта из этого (один, который генерирует статическую библиотеку; и другой, который создает динамическую библиотеку => Я стараюсь избегать этого)
  • Найти решение для статической связи библиотек DLL
  • Найдите способ позволить VS генерировать два выхода из одного проекта

Ответы [ 4 ]

7 голосов
/ 04 ноября 2009

В файле проекта C ++ для dll создайте две конфигурации: одну, которая генерирует DLL, и другую, которая генерирует .lib. Два проекта не нужны, так как любой проект .NET / C ++ может поддерживать несколько конфигураций сборки (именно так версии Release и Debug собираются по-разному).

5 голосов
/ 11 января 2009

Другой вариант - иметь два проекта, один из которых выведет .lib, который может быть статически связан, и второй проект, который выведет .dll и будет иметь ваш .lib в качестве зависимости, вы должны добавить .def .dll с символами, которые вы планируете экспортировать, иначе он будет пустым.

4 голосов
/ 08 января 2009

Возьмите копию DLL в Lib (Изменить: если вы не можете найти более дешевый вариант)

1 голос
/ 14 ноября 2014

Вы можете сгенерировать dll и экспортировать точку входа в библиотеку, используя dllexport, это объясняется здесь

http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...