我已经根据MSDN文档完成了所有操作,但我的函数仍然没有导出。 链接1 链接2 链接3
这是我所拥有的(2个项目,DLL和从dll导入的应用程序(,看起来像这样(简短版本(:
DLL functions.h
#prgma once
#ifdef COMPILE_DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif // COMPILE_DLL
namespace wsl
{
EXPORT bool PointInTriangle(int x1, int y1, int x2, int y2, int x3, int y3, int x, int y);
}
DLL 函数.cpp
#include "functions.h"
namespace wsl
{
bool PointInTriangle(int x1, int y1, int x2, int y2, int x3, int y3, int x, int y)
{
// implementation...
return true;
}
}
DLL dllmain.cpp
#include <Windows.h>
BOOL APIENTRY DllMain(
[[maybe_unused]] HMODULE hModule,
DWORD ul_reason_for_call,
[[maybe_unused]] LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
注意:DLL项目中还有其他几个头文件和cpp文件,它们都在编译中,但没有导出任何函数。
应用程序主.cpp
#include "functions.h"
int main()
{
wsl::PointInTriangle(0, 0, 20, 0, 10, 30, 10, 15);
return 0;
}
程序输出:
2>main.obj : 错误 LNK2019: 未解析的外部符号 "__declspec(dllimport(布尔__cdecl wsl::P ointInCircleSector(int,int,int,float,float(" (__imp_?PointInCircleSector@wsl@@YA_NHHHMM@Z( 在函数中引用 Main 2>main.obj : 错误 LNK2019: 未解析的外部符号 "__declspec(dllimport(布尔__cdecl wsl::P ointInTriangle(int,int,int,int,int,int,int,int,int(" (__imp_?PointInTriangle@wsl@@YA_NHHHHHHHH@Z( 在函数中引用 Main 2>main.obj : 错误 LNK2019: 未解析的外部符号 "__declspec(dllimport(布尔__cdecl wsl::P ointInEllipse(int,int,int,int,int,int(" (__imp_?PointInEllipse@wsl@@YA_NHHHHHH@Z( 在函数 main 中引用 2>main.obj : 错误 LNK2019: 未解析的外部符号 "__declspec(dllimport(布尔__cdecl wsl::P ointInCircle(int,int,int,int,int(" (__imp_?PointInCircle@wsl@@YA_NHHHHH@Z( 在函数 main 中引用 2>main.obj : 错误 LNK2019: 未解析的外部符号 "__declspec(dllimport(布尔__cdecl wsl::P ointInRectangle(int,int,int,int,int,int(" (__imp_?PointInRectangle@wsl@@YA_NHHHHHH@Z( 在函数中引用 main 2>C:\Users\User\source\repos\WindowsSuperLibrary\x64\Debug DLL\MathSample.exe:致命错误LNK1120:5 个未解析的外部 2>完成构建项目"MathSample.vcxproj" -- 失败。
你能解释一下这里有什么问题吗?
我已经对 dll 运行了 dumpbin/EXPORTS,并且可以确认没有导出任何函数。
当然COMPILE_DLL
宏是在 DLL 项目中定义的。
我确实将导入库包含在我的项目中。
标头文件和 cpp 文件中的命名空间名称相同。
为了实际导出在源文件中声明的 DLL 函数,必须执行以下两项操作之一:
(1( 将__declspec(dllexport)
属性添加到定义它的源中的函数(而不仅仅是在标头中(。
或者 (2( 将函数添加到模块定义文件 (.def( 中的EXPORTS
列表中。
可用的文档(尤其是较旧的内容(倾向于假设使用 .def 文件EXPORTS
方法,并且可能会产生很大的误导。