Создание DLL, путаница с __declspec (dllexport) - PullRequest
3 голосов
/ 09 января 2011
Visual Studio C++ 2005
Windows XP

Я создаю эту библиотеку DLL. DLL фактически связывается с другой LIB. Я включил заголовки и путь к библиотеке. Все компилируется нормально.

На самом деле, этот код, который я написал для работы в Linux, работает нормально. Теперь я портирую его для запуска на windows.

Однако я заметил, что некоторые DLL из некоторых примеров кода используют это в заголовочном файле:

static __declspec(dllexport) float some_function(int num1, int num2);

Тем не менее, я сделал следующий пример кода ниже для заголовочного файла * .h. Тем не менее, не уверен, если мне все еще нужно выше или нет?

#ifdef __cplusplus
extern "C" {
#endif

media_t* get_media(media_description_t* obj);
void* get_item(media_description_list_t *obj, int num);
int get_number_format(media_t *obj);
const char* get_media_value(media_t *obj);

#ifdef __cplusplus
}
#endif

Пример кода для реализации * .cpp файла

int get_number_format(media_t *obj)
{
    Media *med = (Media*)obj;
    return med->getNumFormat();
}

Итак, нужно ли мне это static __declspec(dllexport)?

Большое спасибо за любой совет,

Ответы [ 4 ]

4 голосов
/ 09 января 2011

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

2 голосов
/ 09 января 2011

__declspec(dllexport) добавляет функцию в таблицу экспорта DLL. Эта таблица является соглашением, которое позволяет процессу, желающему использовать DLL, для правильного вызова функции.

Существуют и другие способы экспорта функций из DLL , но этот, вероятно, более современный и простой в использовании.

1 голос
/ 09 января 2011

да, это необходимо, если у вас нет dllexport, функция не будет доступна ни в каком другом приложении, где вы вызываете эту функцию.

0 голосов
/ 13 апреля 2011

Если вы поместите реализацию метода в файл h, вам не нужно использовать объявление __declspec(dllexport).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...