私のプロジェクト用に新しいファイルを作成する際に問題があるようです。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)" ([email protected]@@[email protected]) 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)" ([email protected]@[email protected]@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@XZ) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall sky::OutOfRange::~OutOfRange(void)" ([email protected]@@[email protected]) 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'ファイルです。これはリンカが探しているファイルなので、ここでは言及しません。 – PaulMcKenzie
'DLLの設定に問題があるとは思わないです.'あなたのエラーは' OutOfRange() '、'〜OutOfRange() '、' getMessage() '_の定義が正しくリンクされているためです。 DLLをどのようにリンクしているか教えてください。もちろん、どのIDEを使用していますか? – ssell