Можно ли создать статическую библиотеку (один файл .lib), которую впоследствии можно будет скомпилировать с помощью / MT, / MTd, / MD или / MDd? - PullRequest
6 голосов
/ 23 августа 2010

Вместо создания 4 разных библиотек (одна для MT, MTd, MD, MDd ) я хочу создать библиотеку, которая не определяет свою зависимость от библиотеки времени выполнения C (CRT).

Я попытался передать параметр "/ c / Zl" компилятору vc10, а затем / NODEFAULTLIB команде lib. Позже, когда я использую такой lib, у меня все еще есть ошибки, когда я компилирую свою программу с переключателем, отличным от default / MT. например / MD вот несколько первых ошибок:

msvcprt.lib(MSVCP100.dll) : error LNK2005: "public: class std::basic_ostream<char,struct std::char_traits<char> > & __thiscall std::basic_ostream<char,struct st
d::char_traits<char> >::operator<<(class std::basic_ostream<char,struct std::char_traits<char> > & (__cdecl*)(class std::basic_ostream<char,struct std::char_tra
its<char> > &))" (??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z) already defined in lib.lib(lib.obj)
msvcprt.lib(MSVCP100.dll) : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::endl(class std::basic_ostream<char,stru
ct std::char_traits<char> > &)" (?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z) already defined in lib.lib(lib.obj)

Можно ли создать статическую библиотеку (один .lib-файл), которая впоследствии может быть скомпилирована в конечных программах с помощью / MT, / MTd, / MD или / MDd?

Ответы [ 3 ]

2 голосов
/ 23 августа 2010

Обычно я бы сказал, что / MT / Zl являются важными опциями для создания 'нейтрального' файла lib.

Проблема здесь в том, что в среде c ++ существует конфликт, а не среда выполнения c. Кажется, он решил добавить реализации некоторых шаблонных классов в файл lib.lib - и можно понять, почему - в сборке / MT вы сказали компилятору, что dll-библиотеки c-runtime не могут использовать предварительно скомпилированные формы общих шаблонных экземпляров - поэтому в заголовочных файлах STL будет выбран вариант, который будет встроен.

Возможно, есть некоторые дополнительные определения макросов, которые управляют тем, как заголовочные файлы STL выбирают для представления их функциональности. Не зная, что это такое, кажется, что простое правило таково: на самом деле вы не можете создать нейтральную библиотеку во время выполнения, если используется STL.

1 голос
/ 23 августа 2010

Одной из идей было бы не использовать какие-либо функции CRT.

0 голосов
/ 23 августа 2010

Вы можете использовать DLL вместо Lib.DLL образует отдельный домен ссылок.Библиотеки DLL с разными средами исполнения / компиляторами могут быть легко смешаны.

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