Создание программных библиотек в Windows и LINUX [C ++] - PullRequest
8 голосов
/ 09 июня 2009

Я планирую использовать библиотеки в моей C ++ программе. Разработка происходит под Linux, но приложение предназначено для компиляции как под Linux, так и под Windows. Я понимаю, что прямой эквивалент для разделяемых библиотек (.so) в Windows - это DLL, верно?

В Linux с использованием g ++ я могу создать разделяемую библиотеку, используя флаги -fPIC и -shared. AFAIK, для общей библиотеки не требуется никаких других изменений кода. Но в Windows DLL все по-другому. Там я должен указать функции, которые нужно экспортировать, используя dllexport , верно?

Мой вопрос: как мне справиться с этой ситуацией? Я имею в виду dllexport недопустим в Linux, и компилятор выдаст ошибку. Но это требуется в Windows. Итак, как мне написать функцию, которая будет компилироваться на обеих платформах без какого-либо изменения кода?

Используемые компиляторы

  • g ++ - LINUX
  • VC ++ - Windows

Любая помощь будет отличной!

Ответы [ 4 ]

9 голосов
/ 09 июня 2009

Уточняем __declspec(dllexport) для класса:

#define EXPORT_XX __declspec(dllexport)

class EXPORT_XX A
{
};

Затем вы можете проверить платформу и определить макрос только в Windows. E.g.:

#ifdef WIN32
#define EXPORT_XX __declspec(dllexport)
#else
#define EXPORT_XX
#endif

Мы в основном строим статические библиотеки, поэтому для динамических библиотек может быть больше вещей, но концепция та же - используйте макрос препроцессора для определения строки, которую нужно вставить в код Windows.

5 голосов
/ 09 июня 2009

Другая альтернатива - просто использовать файл .def для вашего проекта Windows. Этот файл определяет экспорт DLL, поэтому вам не придется испортить вашу базу кода. (Но макросы - определенно лучший способ, если вы хотите избежать лишнего файла.)

2 голосов
/ 09 июня 2009

Вы можете использовать директиву препроцессора #ifdef для условной компиляции. Например:

#ifdef WIN32
    // Win32 specific code
#else
    // Elsewhere
#endif
1 голос
/ 09 июня 2009

Другой вариант, который я использую сейчас, - это использование MinGW в Windows. Таким образом, вы можете использовать gcc в Windows, и вам не нужно беспокоиться о бессмысленности declspec.

...