1

在 Visual Studio 2015 中构建我的 dll 时,我似乎可以使用__declspec(dllexport)__declspec(dllimport)互换。在制作 DLL 时,我会认为该dllexport命令是必需的,但它似乎要么dllexportdllimport足够了。我有以下头文件声明一个简单的添加()函数:

添加.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 文件中具有以下定义:

添加.cpp

#include "add.h"

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

我似乎能够使用构建的 DLL,无论是否ADDDLL_EXPORTS在配置属性 > 预处理器 > 预处理器定义中定义。例如,在一个包含 .lib 文件作为附加依赖项(配置属性>链接器>输入>附加依赖项)的单独项目中,我有以下代码运行

主文件

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

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

任何见解表示赞赏。如果需要更多信息,请告诉我。提前致谢!

4

1 回答 1

3

如果你仔细看,你会看到你的 DLL 项目在编译时带有警告,如下所示:

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

编译器知道你做的不好。dllimport不应定义函数,而应仅声明函数。所以当编译器看到定义时,它假设dllexport应该使用,因为这是最合理的错误解决方案。

将编译器警告视为错误是一种很好的做法。

于 2019-09-27T20:58:13.847 回答