【发布时间】: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 等?