dllexport 函数未导出
dllexport functions not exported
我已根据 MSDN 文档完成所有操作,但我的函数仍未导出。
LINK1 LINK2 LINK3
这是我的(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 functions.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文件,都在编译,但没有函数导出。
申请main.cpp
#include "functions.h"
int main()
{
wsl::PointInTriangle(0, 0, 20, 0, 10, 30, 10, 15);
return 0;
}
程序输出:
2>main.obj : error LNK2019: unresolved external symbol
"__declspec(dllimport) bool __cdecl
wsl::PointInCircleSector(int,int,int,float,float)"
(__imp_?PointInCircleSector@wsl@@YA_NHHHMM@Z) referenced in function
main 2>main.obj : error LNK2019: unresolved external symbol
"__declspec(dllimport) bool __cdecl
wsl::PointInTriangle(int,int,int,int,int,int,int,int)"
(__imp_?PointInTriangle@wsl@@YA_NHHHHHHHH@Z) referenced in function
main 2>main.obj : error LNK2019: unresolved external symbol
"__declspec(dllimport) bool __cdecl
wsl::PointInEllipse(int,int,int,int,int,int)"
(__imp_?PointInEllipse@wsl@@YA_NHHHHHH@Z) referenced in function main
2>main.obj : error LNK2019: unresolved external symbol
"__declspec(dllimport) bool __cdecl
wsl::PointInCircle(int,int,int,int,int)"
(__imp_?PointInCircle@wsl@@YA_NHHHHH@Z) referenced in function main
2>main.obj : error LNK2019: unresolved external symbol
"__declspec(dllimport) bool __cdecl
wsl::PointInRectangle(int,int,int,int,int,int)"
(__imp_?PointInRectangle@wsl@@YA_NHHHHHH@Z) referenced in function
main 2>C:\Users\User\source\repos\WindowsSuperLibrary\x64\Debug
DLL\MathSample.exe : fatal error LNK1120: 5 unresolved externals
2>Done building project "MathSample.vcxproj" -- FAILED.
你能解释一下这里的问题是什么吗?
我已经 运行 dumpbin /EXPORTS 针对 dll 并且可以确认没有函数被导出。
COMPILE_DLL
宏当然是在dll工程中定义的
我确实将导入库包含到我的项目中。
头文件和 cpp 文件中的命名空间名称相同。
为了实际导出 DLL 的源文件中声明的函数,您必须执行以下两项操作之一:
或者 (1) 将 __declspec(dllexport)
属性添加到函数 在定义它的源中 (不仅仅是header).
或 (2) 将函数添加到模块定义文件 (.def) 中的 EXPORTS
列表。
可用文档(尤其是较旧的文档)倾向于假设使用 .def 文件 EXPORTS
方法,并且可能会产生误导。
我已根据 MSDN 文档完成所有操作,但我的函数仍未导出。 LINK1 LINK2 LINK3
这是我的(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 functions.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文件,都在编译,但没有函数导出。
申请main.cpp
#include "functions.h"
int main()
{
wsl::PointInTriangle(0, 0, 20, 0, 10, 30, 10, 15);
return 0;
}
程序输出:
2>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) bool __cdecl wsl::PointInCircleSector(int,int,int,float,float)" (__imp_?PointInCircleSector@wsl@@YA_NHHHMM@Z) referenced in function main 2>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) bool __cdecl wsl::PointInTriangle(int,int,int,int,int,int,int,int)" (__imp_?PointInTriangle@wsl@@YA_NHHHHHHHH@Z) referenced in function main 2>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) bool __cdecl wsl::PointInEllipse(int,int,int,int,int,int)" (__imp_?PointInEllipse@wsl@@YA_NHHHHHH@Z) referenced in function main 2>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) bool __cdecl wsl::PointInCircle(int,int,int,int,int)" (__imp_?PointInCircle@wsl@@YA_NHHHHH@Z) referenced in function main 2>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) bool __cdecl wsl::PointInRectangle(int,int,int,int,int,int)" (__imp_?PointInRectangle@wsl@@YA_NHHHHHH@Z) referenced in function main 2>C:\Users\User\source\repos\WindowsSuperLibrary\x64\Debug DLL\MathSample.exe : fatal error LNK1120: 5 unresolved externals 2>Done building project "MathSample.vcxproj" -- FAILED.
你能解释一下这里的问题是什么吗?
我已经 运行 dumpbin /EXPORTS 针对 dll 并且可以确认没有函数被导出。
COMPILE_DLL
宏当然是在dll工程中定义的
我确实将导入库包含到我的项目中。
头文件和 cpp 文件中的命名空间名称相同。
为了实际导出 DLL 的源文件中声明的函数,您必须执行以下两项操作之一:
或者 (1) 将 __declspec(dllexport)
属性添加到函数 在定义它的源中 (不仅仅是header).
或 (2) 将函数添加到模块定义文件 (.def) 中的 EXPORTS
列表。
可用文档(尤其是较旧的文档)倾向于假设使用 .def 文件 EXPORTS
方法,并且可能会产生误导。