错误LNK2019:EXE使用具有多个标头的DLL和由其他类组成的主类的源

时间:2015-10-17 12:54:16

标签: c++ visual-studio visual-studio-2010 visual-studio-2012 dll

我正在尝试构建“AccountDllTest.cpp”以在Visual Studio 2013中测试dll“Account.dll”,但不断收到此链接器错误..

    1>------ Build started: Project: AccountDllTest, Configuration: Debug x64 ------
    1>AccountDllTest.obj : error LNK2019: unresolved external symbol "public: __cdecl Date::Date(int,int,int)" (??0Date@@QEAA@HHH@Z) referenced in function main
    1>AccountDllTest.obj : error LNK2019: unresolved external symbol "public: int __cdecl Date::getMonth(void)" (?getMonth@Date@@QEAAHXZ) referenced in function main
    1>C:\Users\Soumyadeep\Documents\Projects\AccountDllTest\x64\Debug\AccountDllTest.exe : fatal error LNK1120: 2 unresolved externals
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

使用带有以下文件的Visual Studio 2013也成功构建了“Account.dll”

  1. Interface.h
  2. Account.h
  3. Date.h
  4. time.h中
  5. Account.cpp
  6. Date.cpp
  7. Time.cpp
  8. 这里“ Interface.h ”只定义了包含纯虚函数的抽象类“ IAccount ”和“ Account.h ”定义从“ IAccount ”类派生的“帐户”类。 “ IAccount ”和“帐户”类由“日期”和“时间”类的对象组成在“ Date.h ”,“ Date.cpp ”,“ Time.h ”,“ Time.cpp”中定义和实施“分别。

    AccountDllTest.cpp的代码如下所示

    #include<iostream>
    #include<conio.h>
    #include"Headers\Interface.h"
    #include<Windows.h>
    using namespace std;
    
    typedef IAccount* (_cdecl *FactoryFunc)();
    int main()
    {
        HINSTANCE dll_handle = LoadLibrary(TEXT("..\\Core\\Account.dll"));
        if (!dll_handle)
        {
            cout << "\n Unable to load Dll!!" << endl;
        }
        else
        {
            cout << "\n Dll successfully loaded!!" << endl;
        }
    
        FactoryFunc Create = (FactoryFunc)GetProcAddress(dll_handle, "createAccount");
        IAccount* AC_1 = Create();
        AC_1->setAccountNo(1);
        AC_1->credit(2300);
        cout << "\n Balance after credit" << AC_1->getBalance() << endl;
        AC_1->lockAccount();
        AC_1->credit(2300);
        Date a;
        a = AC_1->getLockDate();
        cout<<"The account was locked on " ;
        a.print();
        _getch();
        return 0;
    }
    

    在我决定在此行之后测试Date对象

    之前,代码运行没有打嗝
     AC_1->credit(2300);
    

    我错过了什么? 对不起这个长期的问题,但非常感谢任何帮助...

2 个答案:

答案 0 :(得分:0)

如果您使用dll中的类(因为我看到这是Date类),首先必须使用__declspec dllimport导入这些类,其次必须将测试程序与dll库链接(yourdll.lib)解析外部符号:

AccountDllTest.obj : error LNK2019: unresolved external symbol "public: __cdecl Date::Date(int,int,int)" (??0Date@@QEAA@HHH@Z) referenced in function main
AccountDllTest.obj : error LNK2019: unresolved external symbol "public: int __cdecl Date::getMonth(void)" (?getMonth@Date@@QEAAHXZ) referenced in function main

尝试在此处阅读dllimport和dllexport:https://msdn.microsoft.com/en-us/library/81h27t8c.aspx

答案 1 :(得分:0)

您必须从项目中引用DLL。 要做到这一点,只需:

  1. 在解决方案资源管理器中,单击您的项目,然后在菜单栏上单击&#34;项目&#34;和下一个&#34;参考文献。
  2. 在&#34; Common Properties&#34;中,点击&#34;框架和参考&#34;和下一个&#34;添加新的参考&#34;
  3. 关于&#34;项目&#34;选项卡,选择您的dll项目,然后单击&#34;确定&#34;。
  4. 此外,您还需要修改包含目录路径。

    1. 在Solutions Explorer中,右键单击您的项目,然后单击&#34; Properties&#34;
    2. In&#34; C / C ++&#34;节点(在&#34;配置属性&#34;)下,选择&#34;常规&#34;
    3. 在&#34;其他包含目录&#34;中,添加DLL标题(.h)的位置路径,然后点击&#34;确定&#34;
    4. 您可以阅读使用DLL创建广告的官方文档。 https://msdn.microsoft.com/en-us/library/ms235636.aspx

      请注意,您必须在标头上添加定义:     #ifdef YOURHEADER_EXPORTS     #define YOURHEADER_API __declspec(dllexport)     #其他     #define YOURHEADER_API __declspec(dllimport)     #ENDIF