Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
В общем, есть две проблемы, которые необходимо решить:
__ declspec (dllexport)
и Для первого вам потребуется узнайте о __ 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 также является вариантом, но я не могу говорить за него сам.
Вы можете легко сделать это с помощью # ifdef. В Windows _WIN32 должен определяться компилятором (даже для 64-разрядной версии), поэтому код вроде
#ifdef _WIN32
# define EXPORTIT __declspec( dllexport )
#else
# define EXPORTIT
#endif
EXPORTIT int somefunction();
должен работать для вас.
Может быть, это Лучше, если вы добавите 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;
}