Использование dllimport вместо dllexport - PullRequest
1 голос
/ 27 сентября 2019

Кажется, что я могу использовать __declspec(dllexport) и __declspec(dllimport) взаимозаменяемо при сборке моей dll в Visual Studio 2015. При создании библиотеки DLL я бы подумал, что команда dllexport потребуется, но кажется, что либо dllexport или dllimport достаточно. У меня есть следующий файл заголовка, объявляющий простые функции add ():

add.h

#pragma once

#ifdef ADDDLL_EXPORTS
#define ADDDLL_API __declspec(dllexport)
#else
#define ADDDLL_API __declspec(dllimport)
#endif

ADDDLL_API int add(int x, int y);

со следующим определением в файле cpp:

add.cpp

#include "add.h"

int add(int x, int y)
{
    return x + y;
}

Кажется, я могу использовать встроенную DLL независимо от того, определена ли ADDDLL_EXPORTS в Свойствах конфигурации> Препроцессор> Определения препроцессора.Например, в отдельном проекте, который включает в себя файл .lib в качестве дополнительной зависимости (Свойства конфигурации> Линкер> Вход> Дополнительные зависимости), у меня есть следующий код, который запускает

main.cpp

#include <iostream>
#include "add.h"

int main()
{
    int sum = add(4, 5);
    std::cout << "sum = " << sum << std::endl;
    std::system("pause");
    return 0;
}

Любое понимание приветствуется.Дайте мне знать, если потребуется дополнительная информация.Заранее спасибо!

1 Ответ

2 голосов
/ 27 сентября 2019

Если вы посмотрите внимательно, вы увидите, что ваш проект DLL компилируется с предупреждениями , например:

 c:\yourproject\add.cpp(3,1):warning C4273: 'add': inconsistent dll linkage

Компилятор знает, что вы ничего не добились.Функция dllimport не должна быть определена, только объявлена.Поэтому, когда компилятор видит определение, он предполагает, что вместо него следует использовать dllexport, поскольку это наиболее разумное решение ошибки.

Хорошей практикой является трактовать предупреждения компилятора как ошибки .

...