我似乎在为项目创建新文件时遇到了一些问题。
问题是,在我的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文件。
答案 0 :(得分:2)
未解析的外部始终是链接错误。甚至还有它的名字:LNK2019。
告诉你它无法找到sky :: OutOfRange :: OutOfRange()的实现
你把它放在某个地方的标题中并且你已经调用了它,但是你还没有链接到实现它的库。
我们无法告诉您哪个库实现了它或它在硬盘上的位置。您将不得不查阅OutOfRange的文档,作者或者您自己。
我可以告诉你,你要检查: 右键单击可执行项目 - &gt;
properties-&gt; linker-&gt; general-&gt;其他库目录 properties-&gt; linker-&gt; input-&gt;其他依赖
并确保定义OutOfRange的库的路径在前者中,而库名称在后者中。
编辑:如果库本身有一个导入它的标题,就像你发布的代码一样,你只需要设置其他目录部分。
最后,您必须查阅您正在使用的任何图书馆的文档或访问他们的论坛。