#visual-studio #visual-c #static-libraries
#visual-studio #visual-c #статические библиотеки
Вопрос:
Всякий раз, когда вы связываете статические библиотеки с вашим проектом Visual C , вы должны убедиться, что значение для библиотеки времени выполнения проекта соответствует значению, которое использовалось для компиляции библиотеки. Если, например, библиотека была скомпилирована с опцией для статических сред выполнения, и вы пытаетесь скомпилировать проект с динамическими средами выполнения, компоновщик выдаст ошибку.
Очевидно, что компоновщик имеет способ определить, была ли библиотека скомпилирована со статическим или динамическим временем выполнения. Мне было интересно, есть ли инструмент командной строки, который использует библиотеку и может напрямую сообщить мне, какие среды выполнения использовались при ее создании?
Ответ №1:
dumpbin /directives
ваш друг:
C:jm>type 08.cpp
int main() { }
C:jm>cl /nologo /c /MT 08.cpp
08.cpp
C:jm>dumpbin /nologo /directives 08.obj
Dump of file 08.obj
File Type: COFF OBJECT
Linker Directives
-----------------
/DEFAULTLIB:LIBCMT
/DEFAULTLIB:OLDNAMES
Summary
60 .debug$S
2F .drectve
7 .text$mn
C:jm>
Обратите внимание на /DEFAULTLIB:LIBCMT
раздел «Директивы компоновщика». Эта директива компоновщика вводится в объект при компиляции с /MT
помощью (статический релиз CRT). /MT
Все параметры , /MTd
, /MD
, и /MDd
компоновщика приводят к перетаскиванию разных библиотек среды выполнения. Подробности см. В документации.
Библиотека — это просто набор объектов, поэтому вы можете использовать dumpbin /directives
файл библиотеки для получения директив, содержащихся в каждом объекте библиотеки. Обратите внимание, что возможно (хотя и довольно редко), чтобы разные объекты в одной статической библиотеке компилировались с разными параметрами библиотеки времени выполнения.
Комментарии:
1. Пока выглядит отлично. Но может ли быть так, что это работает только для библиотек, которые были созданы в режиме отладки? Для библиотек, которые были скомпилированы в режиме выпуска, инструмент всегда возвращается пустым.
2. В приведенном здесь примере
08.cpp
компилируется «в режиме выпуска» (/MT
= static, release CRT). Это было с Visual C 2013; Я не знаю, что произойдет со старыми версиями, но я ожидаю, что это сработает.3. Итак, что мы должны видеть в выводе dumpbin при работе со статическим .lib? И что мы должны увидеть при запуске с помощью dynamic .lib (сопряжение с dll)?