C++ 使用_declspec(dllexport)而不是-EXPORT:

C++ 使用_declspec(dllexport)而不是-EXPORT:,c++,windows,visual-c++,dll,C++,Windows,Visual C++,Dll,我在看有关导出函数的文档,其中指出u declspec(dllexport)应该在命令行版本之前使用-EXPORT:如果可能的话。我目前正在使用命令行变量。在尝试进行这些更改时,我试图理解正确的实现,但我遇到了问题 DLL的头文件: #ifdef LIBRARY_EXPORTS #define LIBRARY_API __declspec(dllexport) #else #define LIBRARY_API __declspec(dllimport) #endif #define PRIN

我在看有关导出函数的文档,其中指出u declspec(dllexport)应该在命令行版本之前使用-EXPORT:如果可能的话。我目前正在使用命令行变量。在尝试进行这些更改时,我试图理解正确的实现,但我遇到了问题

DLL的头文件:

#ifdef LIBRARY_EXPORTS
#define LIBRARY_API __declspec(dllexport)
#else
#define LIBRARY_API __declspec(dllimport)
#endif

#define PRINT_TEST(name) LIBRARY_API void name()
typedef PRINT_TEST(print_log);
// ^ What's the C++11 equivalent with the using keyword?
DLL的源文件:

PRINT_TEST(PrintTest) {
    std::cout << "Testing DLL" << std::endl;
}
print_test* printTest = reinterpret_cast<print_test*>(GetProcAddress(testDLL, "PrintTest"));
打印测试(打印测试){

STD::CUT> P>问题是因为您导出了一个C++函数,它有一个被损坏的名称。您要么需要将这个被损坏的名称传递给GETPROCEDATE(从不好玩),要么需要使用函数声明< /P>中的“y.STDCULL”来取消导出。
LIBRARY_API __stdcall void PrintTest

或> <代码>外部“C”<代码> > <代码>·ysSTDLID比较简单,将调用约定从C++风格改为C样式。(这可能需要通过“Apple PrtTestTo”来传递GeCuto地址,因为C函数名是如何导出的)。

我有一个问题,为什么要从.dll动态获取函数,而不是包含.dll头文件并链接到.dll lib文件?很难猜到库API可能是什么。使用/EXPORT linker选项是从dll导出标识符的一种方法。这是最痛苦的方法。下一种痛苦较小的方法是通过使用.def文件实现的。到目前为止,最简单的方法是应用_declspec(dllexport)在源代码中选择属性,选择最简单的方法是最容易的。你遇到什么问题?<代码> GePosiTrave<代码>返回NULL?@ AlgRdDasPrIDyIUS。我正在测试运行时编译的C++。以正确的方式。非常感谢。名称损坏是问题所在。我正在查看映射文件。这些都是生成的函数签名吗?如果函数名称和参数从未更改,是否保证相同?@Kookehs在这两个问题上都是正确的。损坏的名称列在映射文件中,损坏的名称不会更改更改,除非参数类型或返回类型更改。
LIBRARY_API __stdcall void PrintTest