代码之家  ›  专栏  ›  技术社区  ›  Hasan Emrah Süngü

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

  •  0
  • Hasan Emrah Süngü  · 技术社区  · 6 年前

    开发环境: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 ,然后从项目设置中,我添加了 AIP.LIB 到其他要链接的库以及我设置的附加库目录中。

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

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

    我得到以下错误:

    错误LNK2019:函数main中引用的未解析外部符号validate

    编译程序也告诉它链接错误。经过一番搜索,我补充说 __declspec(dllexport) 对我 验证 方法。

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

    然后我可以编译和运行而不产生任何问题。我的问题是:

    对于存在于 A.dll ,如果我试图从外部源(如测试应用程序)访问这些方法、类、变量等,是否必须将它们设置为 __declspec ?

    对于Windows环境下的C++开发,我是相当新的。我不记得在使用G++时做过类似的事情。事先谢谢。

    1 回复  |  直到 6 年前
        1
  •  3
  •   user3132457    6 年前

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