Создание библиотек программ в 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.