Узнайте, требуется ли для библиотеки статическое или динамическое время выполнения

#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)?