Защо трябва да посочвам тип библиотека по време на изпълнение за изграждане на статична библиотека?

Свързва ли се с библиотеката по време на изпълнение, когато изграждам своята статична библиотека? „Поставя ли“ кода от runtime lib в моята lib?

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

Трябва ли да използвам една и съща версия на библиотеката за изпълнение във всички мои статични библиотеки и dll? Трябва ли да използвам един и същи тип (/MT /MTd /MDd ...) във всички мои статични библиотеки и dll?

И още един кратък въпрос, обичайно ли е статичните библиотеки на windows да са два пъти по-големи от статичните библиотеки на linux?


person MarcinG    schedule 03.12.2014    source източник
comment
Бърз тест. Променете библиотеката за изпълнение на нещо различно от това, което е зададено за сега. Натиснете Build (не правете Rebuild All). Имайте предвид, че цялата библиотека е възстановена от нулата, като се компилират всички модули. Имайки предвид всичките ви въпроси, какво означава това?   -  person PaulMcKenzie    schedule 03.12.2014


Отговори (1)


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

да

Трябва ли да използвам една и съща версия на библиотеката за изпълнение във всички мои статични библиотеки и dll?

Силно силно го съветвам. Ще получите бъркотия от грешки при свързване, ако не го направите.

Трябва ли да използвам един и същи тип (/MT /MTd /MDd ...) във всички мои статични библиотеки и dll?

да

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

РЕДАКТИРАНЕ: Дори и да не пускате на трета страна, все пак искате да сте сигурни, че свързвате към правилния DLL, когато сте в режим на отстраняване на грешки срещу издаване. Това е така, защото когато създавате 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