【问题标题】:Unresolved external symbol in C++ MFC libraryC++ MFC 库中未解析的外部符号
【发布时间】:2014-01-21 20:01:17
【问题描述】:

我正在尝试在我的应用程序中实现一个 DLL,但是自从我编写 C++ 以来它已经过去了一段时间,所以我在这里遇到了一些麻烦...... 我在 DLL 中的类使用特定于该项目的资源文件。在这里你可以看到我的代码:

// ErrorHandler.h (in Resources.dll - an MFC Library)

namespace HandWritten
{
    class ErrorHandler
    {
    private:
        unsigned int m_error_id;
        string get_error_text();
        string get_error_code();
    public:
        ErrorHandler(unsigned int error_id);
        ~ErrorHandler();
    };
}

我创建了一个包含 MFC 标头的控制台应用程序,它必须测试我的库中的功能。这是测试仪的主要源文件:

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    HMODULE hModule = ::GetModuleHandle(NULL);

    if (hModule != NULL)
    {
        // initialize MFC and print and error on failure
        if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
        {
            // TODO: change error code to suit your needs
            _tprintf(_T("Fatal Error: MFC initialization failed\n"));
            nRetCode = 1;
        }
        else
        {
            // TODO: code your application's behavior here.
        }
    }
    else
    {
        // TODO: change error code to suit your needs
        _tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
        nRetCode = 1;
    }

    new HandWritten::ErrorHandler(30001);

    return nRetCode;
}

我从编译器得到的错误在这里:

error LNK2019: unresolved external symbol "public: __thiscall HandWritten::ErrorHandler::ErrorHandler(unsigned int)" (??0ErrorHandler@HandWritten@@QAE@I@Z) referenced in function _wmain   E:\Applications\HandWritten\Tester\Tester.obj   Tester

请帮帮我,因为如果它不起作用,我会发疯的......

*编辑:* 类构造器的实现:

namespace HandWritten {
    ErrorHandler::ErrorHandler(unsigned int error_id) : m_error_id{error_id}
    {
        string content(MAKEINTRESOURCEA(error_id));
        MessageBoxA(NULL, content.c_str(), "Ok", MB_OK);
    }
}

【问题讨论】:

  • 项目中是否包含了ErrorHandler的实现?
  • 在哪个项目中?我当然有这个类的实现
  • 查看ErrorHandler的构造函数的实现
  • 这可以编译吗?你有 {error_id} 而不是 (error_id)
  • 它编译。如果我知道正确的话,可以使用{value} 构造一个 int。库可以编译,但测试器没有

标签: c++ mfc


【解决方案1】:

这是一个非常常见的实现,表明链接器无法找到该方法的实现。您通常会通过以下方式提供实现:

  • 将包含实现的编译目标文件 (.obj) 传递给链接器。
  • 将包含实现的静态库 (.lib) 传递给链接器。
  • 将导入库 (.lib) 传递给链接器,以便动态链接到提供实现的 DLL。

链接器告诉您您还没有完成任何这些操作。你需要决定你想要哪个选项,然后确保链接器得到它需要的东西。

在我看来,您似乎打算做后者。该实现驻留在 DLL 中。您需要将 DLL 的导入库提供给链接器。您还需要在编译 DLL 时在类上使用__declspec(dllexport),在使用它时在类上使用__declspec(dllimport)

【讨论】:

  • 有一个上传图片的网站,但我不记得它的名字了。我想给你看
  • 我认为我们不需要图片。您已经提供的错误信息就足够了。
  • 看,这里。我正在将该项目添加到我的Tester 项目的引用中。 imgur.com/IhuluE0imgur.com/nCuSkuq
  • 那无济于事。你需要确保你按照我在最后一段中的建议去做。项目 |属性 |配置属性 |链接器 |输入 |附加依赖项。在那里添加您的导入库。还有__declspec(...) 舞蹈。阅读有关如何使您的编译文件可用于导出和导入的文档。
  • 我在 MSDN 网站上读过这篇文章#ifdef MATHFUNCSDLL_EXPORTS #define MATHFUNCSDLL_API __declspec(dllexport) #else #define MATHFUNCSDLL_API __declspec(dllimport) #endif 他们说了一些关于 /D 编译选项的内容。需要吗?
猜你喜欢
  • 2018-08-02
  • 2014-01-06
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 2013-02-28
  • 2012-11-19
  • 1970-01-01
相关资源
最近更新 更多