Скомпилируйте набор функций в .LIB и .DLL одновременно - PullRequest
1 голос
/ 16 февраля 2012

Есть какой-нибудь прием препроцессора или что-то, в чем вы можете одновременно скомпилировать как версию lib, так и dll из набора функций?

Ответы [ 5 ]

3 голосов
/ 16 февраля 2012

Компилятору не нужно знать, создаете ли вы статическую или динамическую библиотеку - он просто создает объектные файлы.

Затем вы можете взять эти объектные файлы и передать их менеджеру библиотеки (создание статической библиотеки) или компоновщик (и создание общего объекта / DLL), и да, вы можете делать оба с теми же объектными файлами, если вы используете файл определения компоновщика для управления экспортом DLL.

Удобный способ работы с Visual Studio - настроить проект DLL в зависимости от статической библиотеки и выбрать параметр «Использовать входы зависимостей библиотеки» для этой зависимости, чтобы гарантировать, что все глобальные объектывключены, а не только те, которые определены в той же единице компиляции, что и экспорт.Тогда файлы будут скомпилированы только один раз, но используются для создания двух библиотек.(Конечно, если вы сталкиваетесь с проблемами с глобальными объектами, ваша статическая библиотека, скорее всего, не работает для других потребителей.)

1 голос
/ 16 февраля 2012

Вывод статической библиотеки или динамической библиотеки не зависит от компилятора. Это работа линкера. Компилятор генерирует файлы .obj, которые связаны компоновщиком (когда выполняются условия, например, вам нужна точка входа для .exe), что вы хотите.

В частности, компоновщик MS link.exe имеет несколько выходных флагов:

no flag: .exe is produced;
/LIB: static library .lib produced;
/DLL: dynamic library .dll and import library .lib produced;

В случае /DLL вы также хотите украсить экспортируемые функции / классы с помощью __declspec(dllexport), поэтому компоновщик поместит их в библиотеку импорта. Также обратите внимание, что статическая библиотека и библиотека импорта НЕ эквивалентны, даже если они оба имеют расширение .lib. Есть также дополнительные файлы, которые могут быть созданы с помощью компоновщика: здесь ссылка на статью MSDN о параметрах link.exe .

РЕДАКТИРОВАТЬ: Как отметил Бен, link.exe /LIB действительно вызывает lib.exe для статической библиотеки. Запуск link /LIB выходов (Windows SDK 7.1 SP1):

D:\Programs\Windows SDK 7.1>link /lib
Microsoft (R) Library Manager Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: LIB [options] [files]

   options:

      /DEF[:filename]
      /ERRORREPORT:{NONE|PROMPT|QUEUE|SEND}
      /EXPORT:symbol
      /EXTRACT:membername
      /INCLUDE:symbol
      /LIBPATH:dir
      /LIST[:filename]
      /LTCG
      /MACHINE:{ARM|EBC|IA64|MIPS|MIPS16|MIPSFPU|MIPSFPU16|
                SH4|THUMB|X64|X86}
      /NAME:filename
      /NODEFAULTLIB[:library]
      /NOLOGO
      /OUT:filename
      /REMOVE:membername
      /SUBSYSTEM:{BOOT_APPLICATION|CONSOLE|EFI_APPLICATION|
                  EFI_BOOT_SERVICE_DRIVER|EFI_ROM|EFI_RUNTIME_DRIVER|
                  NATIVE|POSIX|WINDOWS|WINDOWSCE}[,#[.##]]
      /VERBOSE
      /WX[:NO]
1 голос
/ 16 февраля 2012

Поскольку опция библиотеки / DLL имеет значение для каждой конфигурации и один проект может иметь несколько конфигураций, вы можете сделать это, добавив (например) static-debug, dynamic-debug и т. Д.Это похоже на то, как обрабатывается CRT, со статической и динамической отладкой и без, а в прошлом с многопоточностью и без.

Для этого вам понадобится менеджер конфигурации, чтобы добавитьдополнительные конфигурации для ваших проектов, затем вы можете выполнить пакетную сборку и выбрать любую комбинацию из тех, которые вам нравятся.

Вы можете использовать текстовый редактор, чтобы скопировать существующие конфигурации и переименовать их, если у вас есть много пользовательскихнастройки, которые находятся в самом проекте / конфигурации (вместо глобального проекта или в файле разделенных свойств).

1 голос
/ 16 февраля 2012

Насколько мне известно, вам нужно создать два независимых проекта с одинаковыми исходными файлами. И квалифицируйте ссылки, которые вы хотите предоставить, символом препроцессора, таким как _DLL, заменяемым пустым для статической библиотеки или dll_export / dll_import при сборке или вызове динамической библиотеки.

1 голос
/ 16 февраля 2012

Я не уверен в деталях, как это сделать в Visual Studio, но в основном вам просто нужно настроить два продукта сборки, которые собираются из одного и того же исходного кода, но с разными настройками сборки, напримермакрос, который включает / отключает атрибуты declspec(), используемые в dll.

Я думаю, что в Visual Studio это может проявиться как наличие двух проектов в вашем решении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...