Почему мне нужно указывать тип библиотеки времени выполнения для сборки статической библиотеки?

Связывается ли он с библиотекой времени выполнения, когда я создаю свою статическую библиотеку? "Помещает" ли он код из библиотеки времени выполнения в мою библиотеку?

Или это просто информация для компоновщика, чтобы при связывании окончательного exe (dll) он знал, какую версию библиотеки времени выполнения использовать для этой конкретной статической библиотеки?

Нужно ли мне использовать одну и ту же версию библиотеки времени выполнения во всех моих статических библиотеках и dll? Нужно ли мне использовать один и тот же тип (/ MT / MTd / MDd ...) во всех моих статических библиотеках и dll?

И еще один короткий вопрос: обычно ли статические библиотеки Windows в два раза больше статических библиотек Linux?


person MarcinG    schedule 03.12.2014    source источник
comment
Быстрый тест. Измените библиотеку времени выполнения на что-то другое, кроме того, что установлено на данный момент. Нажмите "Сборка" (не выполняйте "Перестроить все"). Обратите внимание, что вся библиотека перестраивается с нуля, компилируя все модули. Учитывая все ваши вопросы, что это означает?   -  person PaulMcKenzie    schedule 03.12.2014


Ответы (1)


Или это просто информация для компоновщика, чтобы при связывании окончательного exe (dll) он знал, какую версию библиотеки времени выполнения использовать для этой конкретной статической библиотеки?

да.

Нужно ли мне использовать одну и ту же версию библиотеки времени выполнения во всех моих статических библиотеках и dll?

Я настоятельно рекомендую это. Если вы этого не сделаете, вы получите массу ошибок компоновщика.

Нужно ли мне использовать один и тот же тип (/ MT / MTd / MDd ...) во всех моих статических библиотеках и dll?

да.

Если вы выпускаете DLL для использования сторонними организациями, вы можете предоставить им YourLibraryD.dll, который использует флаг / MTd, и YourLibrary.dll, который использует / MT. Имейте разные конфигурации решения для каждого. Никто больше не использует однопоточные версии, потому что снижение производительности сейчас практически не имеет значения и не стоит риска.

РЕДАКТИРОВАТЬ: даже если вы не выпускаете стороннюю версию, вы все равно хотите убедиться, что вы ссылаетесь на правильную DLL в режиме отладки -vs- release. Это связано с тем, что при создании YourApp.exe в Debug, который использует / MTd, вы захотите, чтобы он был связан с YourLibraryD.dll. Когда вы создаете YourApp.exe в Release, который использует / MT, вы захотите, чтобы он связался с YourLibrary.dll в режиме выпуска. Вы можете оставить имя DLL таким же и использовать каталог для устранения неоднозначности: тогда вы связываете bin \ debug \ YourLibrary.dll в режиме отладки и bin \ release \ YourLibrary.dll в режиме выпуска. Извините, если это выходит за рамки вашего вопроса, просто хорошо знать, когда вы впервые переключаете конфигурацию сборки, и внезапно вы начинаете получать ошибки компоновщика.

person Moby Disk    schedule 03.12.2014
comment
Осторожно с YourLibraryD.dll, построенным с /MTd. Вы не можете распространять их просто так (против Microsoft EULA). - person PaulMcKenzie; 03.12.2014
comment
@PaulMcKenzie Ты уверен? Я думал, что вы не можете распространять Debug MSVCRT.DLL, но у вас должна быть возможность распространять свою собственную библиотеку, созданную для этого. - person Moby Disk; 03.12.2014
comment
Да, вы не можете распространять MSVCRTD.DLL. Проблема действительно возникает из-за программистов, которые утверждают, что у них работает только отладочная версия своей программы, и пытаются ее распространить (предлагая им также распространять MSVCRTD.DLL). - person PaulMcKenzie; 03.12.2014