2014-10-09 65 views
0

所以,我有两个项目,项目2建立一个DLL我哪里有这个类(头和CPP后续)与CPP文件琐碎的定义导致链接错误

头虚函数

class classWvirts 
{ 
    public: 
    classWvirts(){}; 
    ~classWvirts(){}; 

    virtual int testVirtualFunction(); 
}; 

CPP

#include "classWvirts.h" 

int classWvirts::testVirtualFunction() 
{ 
    return 1; 
} 

在项目1项(它建立到一个exe),我只是有一个.cpp文件看起来像这样:

#include "../testApp2/classWvirts.h" 
classWvirts obj1; 

int main() 
{ 
    obj1.testVirtualFunction(); 
} 

这种设置似乎有所有成分,它的工作,我的方法,但它被标记为虚拟的,在其CPP文件中一个微不足道的定义。

然而,当我尝试编译,我得到一个LNK2001链接错误,看起来像

错误1错误LNK2019:无法解析的外部符号 “市民:虚拟INT __thiscall classWvirts :: testVirtualFunction(无效)”(? testVirtualFunction @ classWvirts @@ UAEHXZ)在函数_main中引用E:\ Work \ Scratch \ US1212_Virt \ testApp \ testApp \ Source.obj testApp

有人能指出我做错了什么吗?我意识到,如果我把简单的定义放在头文件里,一切都会奏效,但如果这不是一个选项呢? (这显然是我在一个大型项目中遇到的问题的简化版本),将cpp编入一个inl并将其包含在标题中可能有空间,但我宁愿避免这种情况并保持cpp和header的区别。

+0

与DLL导入库的链接。也将该类声明为dll-export。我不记得确切的语法,它是特定于Microsoft的。 – 2014-10-09 03:07:06

+0

是的,刚刚达到了这个结论:)感谢加强相同。 – angryInsomniac 2014-10-09 03:08:24

回答

2

当你正在使用Visual Studio编译一个DLL,你必须从DLL库中的类,宣布其与__declspec(dllexport)导出库

class __declspec(dllexport) classWvirts 
{ 
    ... 

而且你必须导入它在主通过在主项目

class __declspec(dllimport) classWvirts 
{ 

为了使用进口和出口的同一头文件与__declspec(dllimport)宣布它的项目,你可以引入一个宏

#define MY_DLL_IMPORT_EXPORT ... 

class MY_DLL_IMPORT_EXPORT classWvirts 
{ 
    ... 

在编译DLL时您将定义为__declspec(dllexport),在所有其他情况下将定义为__declspec(dllimport)(即,当编译主项目时)。

如果您创建的主要项目对您的DLL项目的依赖时,Visual Studio应该照顾另一个接头自动设置的(即它会自动连接你的DLL的导入库主体工程)。如果您没有该依赖项,则可以创建它或在主项目的链接器设置中手动指定DLL导入库。