C ++ кроссплатформенные динамические библиотеки; Linux и Windows

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

26
задан Michael Currie 10 September 2015 в 21:00
поделиться

3 ответа

В общем, есть две проблемы, которые необходимо решить:

  1. Требование, чтобы в Windows ваша DLL явно экспортировала символы, которые должны быть видимы для внешнего мира (через __ declspec (dllexport) и
  2. Возможность поддерживать систему сборки (в идеале, без необходимости поддерживать отдельный make-файл и проект / решение Microsoft Visual C ++)

Для первого вам потребуется узнайте о __ declspec (dllexport) . В проектах, предназначенных только для Windows, обычно это реализуется так, как я описываю в своем ответе на этот вопрос . Вы можете расширить это на шаг дальше, убедившись, что что ваш символ экспорта (например, MY_PROJECT_API) определен, но не расширяется до нуля при сборке для Linux. Таким образом,вы можете добавлять символы экспорта в свой код по мере необходимости для Windows, не влияя на сборку Linux.

Во-вторых, вы можете исследовать какую-то кроссплатформенную систему сборки.

Если вам нравится набор инструментов GNU , вы можете исследовать libtool (возможно, вместе с automake и autoconf). Инструменты изначально поддерживаются в Linux и поддерживаются в Windows через Cygwin или MinGW / MSYS . MinGW также дает вам возможность кросс-компиляции, то есть создания собственных двоичных файлов Windows при работе с Linux. Два ресурса, которые я нашел полезными для навигации по Autotools (включая libtool), - это «Autobook» (в частности, раздел о DLL и Libtool ) и PowerPoint Александра Дюре-Лутца слайды .

Как уже упоминалось другими, CMake также является вариантом, но я не могу говорить за него сам.

19
ответ дан 28 November 2019 в 07:35
поделиться

Вы можете легко сделать это с помощью # ifdef. В Windows _WIN32 должен определяться компилятором (даже для 64-разрядной версии), поэтому код вроде

#ifdef _WIN32
#  define EXPORTIT __declspec( dllexport )
#else
#  define EXPORTIT
#endif

EXPORTIT int somefunction();

должен работать для вас.

10
ответ дан 28 November 2019 в 07:35
поделиться

Может быть, это Лучше, если вы добавите extern "C" !!!,

/ * Файл cmakelists.txt * /

 SET (LIB_TYPE SHARED)
 ADD_LIBRARY(MyLibrary ${LIB_TYPE} MyLibrary.h)

/ * Файл myLibrary.h * /

#if defined(_WIN32) || defined(__WIN32__)
#  if defined(MyLibrary_EXPORTS) // add by CMake 
#    define  MYLIB_EXPORT extern "C" __declspec(dllexport)
#  else
#    define  MYLIB_EXPORT extern "C" __declspec(dllimport)
#  endif // MyLibrary_EXPORTS
#elif defined(linux) || defined(__linux)
# define MYLIB_EXPORT
#endif

MYLIB_EXPORT inline int Function(int a) {
    return a;
}
7
ответ дан 28 November 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: