0

我正在关注https://cygwin.com/cygwin-ug-net/dll.html中的“构建和使用 DLL”教程。我制作了 mydll.cpp 文件:

#include <iostream>

void hello()
{
    std::cout << "Hello World of DLL" << std::endl;
}

编译并链接它:

g++ -c mydll.cpp
g++ -shared -o mydll.dll mydll.o

然后尝试在 main.cpp 中使用 hello() 函数:

int main ()
{
  hello ();
}  

链接后g++ -o main main.cpp -L./ -l mydll得到:

 error: 'hello' was not declared in this scope
 hello();

该教程指出一切都应该正常工作。我错过了什么?

4

1 回答 1

1

链接过程与编译过程是分开的。您提供了包含hello链接过程中使用的编译定义的库。

但是在链接之前发生的编译过程中,不会以任何方式使用库。为了让编译器知道是什么hello,您仍然需要声明该函数。

这通常通过在main.cpp和共享的头文件中放置前向声明来完成mydll.cpp

// mydll.h

#ifndef HEADER_GUARD_MYDLL_H
#define HEADER_GUARD_MYDLL_H

void hello();

#endif

然后#include "mydll.h"在两者中main.cppmydll.cpp

于 2019-11-20T22:30:37.953 回答