C ++ DLL:未解析的外部符号

时间:2017-03-17 21:01:35

标签: c++ dll

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

问题是,在我的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文件。

1 个答案:

答案 0 :(得分:2)

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

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

你把它放在某个地方的标题中并且你已经调用了它,但是你还没有链接到实现它的库。

我们无法告诉您哪个库实现了它或它在硬盘上的位置。您将不得不查阅OutOfRange的文档,作者或者您自己。

我可以告诉你,你要检查: 右键单击可执行项目 - &gt;

properties-&gt; linker-&gt; general-&gt;其他库目录 properties-&gt; linker-&gt; input-&gt;其他依赖

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

编辑:如果库本身有一个导入它的标题,就像你发布的代码一样,你只需要设置其他目录部分。

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