Создание библиотеки? - PullRequest
       10

Создание библиотеки?

2 голосов
/ 06 октября 2010

Я использую MSVC, но планирую сделать свою библиотеку кроссплатформенной.Прямо сейчас у меня есть h и cpp файлы классов и функций.Делать библиотеку в MSVC так же просто, как добавлять все мои файлы в проект Visual C ++, помеченный как статическая или динамическая библиотека?Или я должен сделать свои классы и функции внешними и еще много чего?

Спасибо

Ответы [ 3 ]

4 голосов
/ 07 октября 2010

В случае DLL вы можете указать <code>__declspec(dllimport) или <code>__declspec(dllexport) в зависимости от того, собираете ли вы DLL или импортируете ее.Рассмотрим этот пример:

// MyHeader.h, part of FooDLL

#ifdef BUILDING_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif

void DLL_EXPORT MyFunction();

class DLL_EXPORT MyClass { 
public: 
 MyClass(); 
};

ПРИМЕЧАНИЕ: Я переупорядочил "void" и "DLL_EXPORT" (ранее DLL_FUNCTION), как я их перепутал раньше.заголовок из проекта DLL, функции будут помечены для экспорта.При включении его из другого проекта (который не имеет определения препроцессора BUILDING_DLL) он будет интерпретироваться как импорт DLL.Это может быть применено к классам точно таким же образом.В Linux (и, возможно, на других аналогичных платформах) вы можете безопасно определить DLL_FUNCTION как вообще ничего, поскольку это не требуется.


Edit: и если вы хотите, чтобы ваши функциичтобы быть вызванным из C, вы, очевидно, захотите добавить также extern "C", чтобы предотвратить искажение имени.


Edit 2: на практике MSVC будетгенерировать статическую библиотеку тоже при сборке DLL.Любой проект, который использует DLL, должен связываться с библиотекой (которая на самом деле не содержит исполняемый код; он все еще динамически связан, как и следовало ожидать), чтобы удовлетворить компоновщик.

1 голос
/ 07 октября 2010

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

Статический

Статическая библиотека (.a | .lib) похожа на создание zip-файла ваших объектных (.o) файлов, чтобы вы могли управлять ими как одним модулем, когда вы компилируете какую-то другую программу для использования статической библиотеки lib всех объектных файлов он должен быть скомпилирован в.

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

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

Динамический

Вам нужно будет указать больше, чем ваши стандартные классы для MSVC

  • Что экспортировать, используя __declspec(dllexport)
  • Что пользователи библиотеки могут получить, используя __declspec(dllimport)
  • будет ли у вас более одной библиотеки

Пример заглушки заголовка, сделайте его достаточно уникальным, чтобы не конфликтовать с другими библиотеками

// MartinsHeader.h
#ifdef BUILDING_DLL_A
#define DLL_A_EXPIMP __declspec(dllexport)
#else
#define DLL_A_EXPIMP __declspec(dllimport)
#endif

void DLL_A_EXPIMP MyFunction();
class DLL_A_EXPIMP MyClass{};

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

Возможно, вы захотите рассмотреть PIMPL, чтобы минимизировать видимые снаружи изменения в реализации ваших классов. (уменьшите потребность пользователей lib в перекомпиляции для новой lib)

Проблемы с памятью

Время выполнения становится важным с точки зрения того, кто что (де) распределяет.

A) Вы можете придерживаться родной модели памяти, в какой момент

  • в некоторых библиотеках будет несколько разных компиляций для однопоточных / многопоточных режимов отладки и выпуска. Это должно соответствовать времени выполнения вызывающего модуля (EXE / DLL)
  • Использование классов в интерфейсе часто добавляет требование о том, что вы используете одну и ту же версию класса как в библиотеке, так и в приложении - часто означает несколько компиляций в версии Visual C.

B) Вы можете принудительно (де) выделить память, введя только фабричные выделения и методы уничтожения, чтобы все это выполнялось библиотекой. (Я не большой поклонник этого, поскольку это делает код более сложным, но это может облегчить проблемы во время выполнения)

0 голосов
/ 07 октября 2010

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

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

Это не такой простой вопрос, это зависит от того, что вы хотите сделать.

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