c++ - 使用另一个 .dll 中定义的方法

标签 c++ dllexport

开发环境:Windows 10、Visual Studio 2017。

我在 api.h 中定义了以下方法并在 api.cpp 中实现,然后编译成 api.dll。编译也生成了api.lib

extern "C" int validate( int v_mode, char * data, int data_length );

我创建了另一个不同的项目。在该项目中,我包含了 api.h,然后从项目设置中,我将 api.lib 添加到要链接的其他库中,并设置了其他库目录。

这个项目是一个 super 简单的控制台应用程序,我将用它来测试前面提到的 validate 方法。

#include "api.h"
int main() {
    char data[] ={1,2,3};
    validate(ValidationModes::Video,data,3);
}

我收到以下错误:

error LNK2019: unresolved external symbol validate referenced in function main

编译器告诉它链接错误。经过一番搜索后,我将 __declspec(dllexport) 添加到我的 validate 方法中。

extern "C" __declspec(dllexport) int validate( int v_mode, char * data, int data_length );

然后我就可以毫无问题地编译和运行了。我的问题如下:

对于存在于 A.dll 中的任何方法、类、变量等,如果我尝试从外部源(例如我的测试应用程序)访问这些方法、类、变量等,请执行我必须将它们设置为 __declspec?

我对 Windows 环境中的 C++ 开发相当陌生。我不记得在使用 g++ 时曾经做过类似的事情。提前致谢。

最佳答案

是的,如果您想在 DLL 外部使用这些“名称”(函数、变量、类等),您必须“导出”它们。请注意,您只需要在 Windows 上执行此操作(默认情况下符号不会从 DLL 导出)。在 Linux 上恰恰相反 - 所有符号都被导出,您需要隐藏任何您不想导出的内容。

关于c++ - 使用另一个 .dll 中定义的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53809946/

相关文章:

c++ - C++ 中的编译器和参数求值顺序

c++ - 打开不存在的文件时如何使 ofstream 构造函数失败?

c++ - 逻辑运算符 ||和&&的区别-我一直在犯错误

c# - 调用可导出函数列表中的另一个函数

c# - UnmanagedExports 函数参数 - 导致 VBA 49 错误的 DLL 调用约定

c# - 导出函数(VS2008)的默认调用约定是什么?

c++ - 64 位驱动程序

c++ - 在 C++ 中定义类字符串常量?

c++ - 如何在C++中使用函数的参数作为指针从DLL返回值?

C++ DLL 不导出函数