Сборка dll со статическими библиотеками - PullRequest
1 голос
/ 25 февраля 2011

Я хочу собрать DLL для использования в качестве приложения IIS / ISAPI. Все идет нормально. Оно работает. Тем не менее, я должен перетащить вокруг DLL времени выполнения и других зависимостей (например, некоторые библиотеки Boost).

Я хотел бы создать одну DLL (чтобы упростить развертывание на нескольких серверах).

Поэтому я изменил переключатель с / MD на / MT. Тем не менее, теперь я получаю ошибки дубликатов символов во время ссылки. Например:

msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: void __thiscall std::basic_ostream<char,struct std::char_traits<char> >::`vbase destructor'(void)" (??_D?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in gateway.obj

Я озадачен тем, что / MD или / MT - это флаги компилятора, а не флаги компоновщика. И это может каким-то образом объяснить, почему я получаю дублированные символы (так как они будут включены в каждый .obj).

Таким образом, вопрос заключается в следующем: как настроить Visual Studio 10, чтобы получить DLL, которая включает все ее зависимости.

1 Ответ

1 голос
/ 25 февраля 2011

Переключатели /MD и /MT применяются только к библиотеке времени выполнения Microsoft C, а не к сторонним библиотекам. Эта документация дает некоторую информацию о том, почему это переключатель компилятора (они приводят к созданию разных определений во время компиляции).

Вставка сторонних DLL непосредственно в вашу собственную DLL как статические библиотеки, вероятно, не простой процесс, если статические библиотеки уже существуют. Я не знаю ни одного стандартного метода для превращения DLL в статическую библиотеку. Быстрый поиск в Интернете показывает, что существуют инструменты, которые утверждают, что выполняют этот процесс (мой быстрый поиск не обнаружил никаких бесплатных). Но я думаю, что наиболее надежным решением было бы использование существующих статических библиотек, если вы можете. Я полагаю, что вы можете создавать статические версии библиотек Bools, которые вы затем можете указать в своем операторе link в Visual Studio (в отличие от именования библиотек для DLL).

...