所以我试图将一个使用另一个 dll 中的类的类导出到 dll 中。一个例子将更好地解释这种情况。
//aclass.h
class __declspec(dllexport) aclass{
public:
void amethod();
};
_
//aclass.cpp
#include "aclass.h"
void aclass::amethod(){
std::cout<<"a method"<<std::endl;
}
因此,在不包含任何外部内容的情况下,它会编译(aclass.dll)并从其他项目运行,例如。
#include <aclass.h>
void main(){
aclass a;
a.amethod();
_getch();
}
当我包含一个外部头文件(带有一个 dll 和一个 lib 文件,其路径被传递给编译器)时,就会出现问题。一旦我包含外部标题:
//aclass.h
#include <externalapi.h>
class __declspec(dllexport) aclass{
public
void amethod();
};
甚至没有从 externalapi 调用任何函数类,当尝试编译时我得到:
Error 1 error LNK2001: unresolved external symbol __imp__Math_e C:\...\aclass.obj aclass
Error 1 error LNK2001: unresolved external symbol __imp__Math_pi C:\...\aclass.obj aclass
Error 1 error LNK2001: unresolved external symbol __imp__Math_zero C:\...\aclass.obj aclass
....etc
最初(没有 __declspec(dllexport) 指令)我会通过以下方式访问这些:
Math::pi;
Math::e;
etc.
因为它们是 externalapi 的静态常量。根据我对 dll 导出的整个工作原理的了解,这就是所谓的名称修饰(?)。所以两个问题:
- 我应该在语法中进行哪些更改,以便外部库的函数名称与其原始 c++ 名称一起“加载”?这必须以某种方式成为可能。到目前为止,我正在开发我的代码,作为一个独立的应用程序,这意味着我没有使用 __declspec(dllexport) 关键字,我包含相同的头文件,使用完全相同的 dll 和 lib 文件,一切都在编译和运行平稳。显然,上面的代码是对我的实际代码的过度简化,以指出问题所在。
- 在我发现的大多数“导出到 dll”方法中,人们使用 __declspec(dllexport) 和 __declspec(dllimport)。我理解 __declspec(dllexport) 或多或少告诉编译器将部分代码导出到 dll,这是有道理的。__declspec(dllimport) 到底是什么意思。例如,为什么我在开始时编写的第一段代码无需 __declspec(dllimport) 就可以作为 dll 进行编译和使用?
谢谢你的时间!