所以我试图将一个使用另一个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.
因为它们是外部的静态常数。 根据我对dll导出的整个过程的理解,这就是所谓的名称修改(?)。所以有两个问题:
谢谢你的时间!
答案 0 :(得分:1)
通常最好有一个根据
导入或导出的条件宏#ifdef MODULE1
#define MODULE1_DECL __declspec(dllexport)
#else
#define MODULE1_DECL __declspec(dllimport)
#endif
这样您可以导出要导出的函数等,并导入要使用的内容。
例如,请参阅此SO post
您项目中的#define MODULE1
(可能是设置)将导出定义,并使用MODULE1_DECL
定义,而不是在代码中明确放置__declspec(dllimport)
或__declspec(dllexport)
。阅读manual了解更多详情。
Name mangling恰好发生在C ++中:它表示名称空间,函数重载等参数用于消除歧义。
答案 1 :(得分:1)
__declspec(dllimport)
告诉编译器该函数将使用导入LIB从DLL导入,而不是在不同的OBJ文件或静态LIB中找到。