【问题标题】:C++ DLL: unresolved external symbolC++ DLL:未解析的外部符号
【发布时间】:2017-03-18 05:32:17
【问题描述】:

我似乎在为我的项目创建新文件时遇到了一些问题。

问题在于,在我的sk_error.h 文件中,它似乎在抱怨unresolved external symbols(完整的错误报告如下)。当我将OutOfRange 类放在我的sk_interface.h 文件中时,没有人会抱怨,但是当我将类放在错误文件中时,它就会出现问题。

如果我要注释掉 OutOfRange 它工作得很好,所以我不认为这是 DLL 设置的问题。

sk_error.h

#include <sk_platform.h>
#include <sk_interface.h>

namespace sky {
    class SK_API OutOfRange : IError {
    public:
        OutOfRange() {
            m_message = " Out Of Range";
            m_value = (0 << 1);
        }
        std::string getMessage() override {
            return m_message;
        }
    };
}

sk_platform.h

#if defined (SK_NONCLIENT_BUILD)
        #ifndef SK_API
            #define SK_API __declspec(dllexport)
        #endif
    #else
        #ifndef SK_API
            #define SK_API __declspec(dllimport)
        #endif
#endif

sk_interface.h

#include <sk_platform.h>
#include <string>

namespace sky {

    ...

    class SK_API IError {
    public:
        virtual std::string getMessage() = 0;
    protected:
        uint32_t m_value = 0;
        std::string m_message = "Error not initialized";
    };

}

使用 DLL 的客户端项目

#include <sk_logmanager.h>
#include <sk_error.h>
#include <iostream>

int main() {
    sky::g_LogManager.startup();
    sky::OutOfRange err;
    std::cout << err.getMessage() << "\n";
    sky::g_LogManager.shutdown();
    while (1) {}
}

错误输出

1>------ Build started: Project: SkyTest, Configuration: Debug Win32 ------
1>main.cpp
1>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall sky::OutOfRange::OutOfRange(void)" (__imp_??0OutOfRange@sky@@QAE@XZ) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall sky::OutOfRange::getMessage(void)" (__imp_?getMessage@OutOfRange@sky@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall sky::OutOfRange::~OutOfRange(void)" (__imp_??1OutOfRange@sky@@QAE@XZ) referenced in function _main
1>C:\Users\Matt\Documents\Game Development\DevEnv\SkyTest\Debug\SkyTest.exe : fatal error LNK1120: 3 unresolved externals
1>Done building project "SkyTest.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

编辑:

我正在使用 Visual Studio 2017(可能是错误的来源)。客户端项目正在使用 .lib 文件。

【问题讨论】:

  • 使用 DLL 的客户端项目 -- 在构建过程中根本不使用 DLL。 使用的是创建的*.lib 文件。你没有提到这个,因为这是链接器正在寻找的文件。
  • I dont think that it is an issue with the DLL setup 您的错误是由于OutOfRange()~OutOfRange()getMessage() 没有的定义被正确链接。你能告诉我们你是如何链接DLL的吗?当然还有你使用的是什么 IDE 等?

标签: c++ dll


【解决方案1】:

未解决的外部始终是链接错误。它甚至有它的名字:LNK2019。

它告诉你它找不到 sky::OutOfRange::OutOfRange() 的实现

你把它放在头文件的某个地方并且你已经调用了它,但你没有链接到实现它的库。

我们无法告诉您实现它的库是什么或它在您的硬盘驱动器上的位置。您必须查阅 OutOfRange、其作者或您自己的文档。

我可以告诉你,你会想要检查: 右键单击可执行项目->

属性->链接器->通用->附加库目录 属性->链接器->输入->附加依赖

并确保定义 OutOfRange 的库的路径在前者中,而库名称在后者中。

编辑:如果库本身有一个导入它的标题,正如您发布的代码中显示的那样,您只需要设置附加目录部分。

最后,您必须查阅您正在使用的任何库的文档或访问他们的论坛。

【讨论】:

    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 2011-12-30
    • 2013-02-28
    • 2012-11-19
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    相关资源
    最近更新 更多