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

时间:2018-12-17 06:28:32

标签: 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添加到了其他库中以进行链接,并设置了其他库目录。

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

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

我收到以下错误:

  

错误LNK2019:函数main中引用的未解决的外部符号验证

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

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

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

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

对于Windows环境下的c ++开发,我还是一个新手。我不记得在使用g ++时曾经做过类似的事情。预先感谢。

1 个答案:

答案 0 :(得分:3)

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