Создание библиотек программ в Windows и LINUX [C++]

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

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

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

компиляторы использовать

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

любой помощь была бы великолепна!

4 ответов


указать __declspec(dllexport) класс:

#define EXPORT_XX __declspec(dllexport)

class EXPORT_XX A
{
};

затем вы можете проверить наличие платформы и определить только макрос в windows. Например:

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

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


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


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

#ifdef WIN32
    // Win32 specific code
#else
    // Elsewhere
#endif

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