Статическая библиотека и флаги для CRT

230
25 сентября 2018, 10:20

Очень неожиданный для меня вопрос. В Visual Studio есть проект статической библиотеки (*.lib). Так вот, на что тогда влияет флаг для выбора CRT, а именно MD/d или MT/d? С одной стороны по названию понятно, что это статическая библиотека, но размер все-таки зависит от этих флагов.

PS: Все спокойно собирается с любыми флагами, но еще не пробовал запускать на других машинах.

Answer 1

Опции MD/d и MT/d указывают тип подключения стандартной библиотеки, это никак не связано с типом проекта. Проект статической библиотеки определяет только то, что ваши модули при линковке будут подключаться статически. CRT при этом может подключаться и динамически. Собственно, большинство программ и использует смешанную линковку - что-то подключается статически через .lib, а что-то через dll. Функции WinAPI, например, всегда подключаются динамически.

Что касается вопроса "почему с динамической сборкой получается больше размер файла" - так ведь сборки еще нет. Реально CRT будет подключаться только при сборке исполняемой программы (или dll), а статическая библиотека содержит только ссылки. Ссылки на функции dll занимают чуть больше места, так что это нормальная ситуация.

Дополнение:

Не совсем понимаю смысл вопроса насчет описания библиотек в зависимостях. Библиотека сама должна включать себя в зависимости. Делается это, например, так:

1) В проекте библиотеки создаются 4 конфигурации - MD, MDD, MT, MTD (или 8 - 4 для x86, и 4 для x64), которые создают библиотекм MyLibMD.lib, MyLibMDD.lib, и т.д.

2) В начале главного файла заголовка библиотеки - то есть некоего MyLib.h, который будут подключать пользователи вашей библиотеки, - пишется вот такая конструкция:

#ifndef _LIB
    #ifdef _DLL
        #ifdef _DEBUG
            #pragma message( "MyLib included (Debug DLL)" )
            #pragma comment(lib, "MyLibMDD.lib")
        #else
            #pragma message( "MyLib included (Release DLL)" )
            #pragma comment(lib, "MyLibMD.lib")
        #endif
    #else       // _DLL
        #ifdef _DEBUG
            #pragma message( "MyLib included (Debug Static)" )
            #pragma comment(lib, "MyLibMTD.lib")
        #else
            #pragma message( "MyLib included (Release Static)" )
            #pragma comment(lib, "MyLibMT.lib")
        #endif
    #endif  // _DLL
#endif  // _LIB

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

#include "mylib.h"

Есть еще один небольшой момент - если библиотека может использоваться из другой библиотеки, то символ _LIB использовать нельзя - в библиотеке-клиенте он тоже определен, и соответственно зависимости будут отключены. Нужно определить свой символ (какой-нибудь MYLIB) в stdafx.h своей библиотеки или в настройках проекта, и использовать его вместо _LIB.

READ ALSO
Как задать разрешение в Android 5.1.1 и меньше

Как задать разрешение в Android 5.1.1 и меньше

Использую данный код чтобы спрашивал разрешение на телефонах

205
VPN клиент Андроид Java

VPN клиент Андроид Java

У меня есть небольшой опыт в разработки приложений но с такой штукой как тунелирование я еще не встречалсяИ встала такая задача

288
Заполнение JList объектами из потока

Заполнение JList объектами из потока

Есть поток в котором формируются объекты, нужно эти объекты записывать в JListчто-то я туплю сутки с этим моментом функция ConnectAndReadLine() формирует...

186
Android. gif-ka не анимируется после вызова метода startAnimation();

Android. gif-ka не анимируется после вызова метода startAnimation();

Необходимо вывести список анимированных гифокДля работы со списком использую адаптер

183