2017-03-17 49 views
1

私のプロジェクト用に新しいファイルを作成する際に問題があるようです。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ファイルを使用しています。

+0

* DLLを使用するクライアントプロジェクト* - DLLはビルドプロセスではまったく使用されません。 **は、作成された '* .lib'ファイルです。これはリンカが探しているファイルなので、ここでは言及しません。 – PaulMcKenzie

+0

'DLLの設定に問題があるとは思わないです.'あなたのエラーは' OutOfRange() '、'〜OutOfRange() '、' getMessage() '_の定義が正しくリンクされているためです。 DLLをどのようにリンクしているか教えてください。もちろん、どのIDEを使用していますか? – ssell

答えて

1

未解決の外部は常にリンクエラーです。 LNK2019という名前でもあります。

それはそれは空の実装を見つけることができないあなたを語っている:: OutOfRange :: OutOfRange()

あなたがどこかのヘッダーでそれを持っていて、それを呼び出しましたが、あなたがそのライブラリにリンクしていませんそれを実装します。

私たちには、それがどのライブラリに実装されているのか、それがハードドライブ上のどこにあるのかは分かりません。あなたはOutOfRange、その著者、またはあなた自身のドキュメントを参照する必要があります。

私はあなたがチェックしたいということを伝えることができます: 右 プロパティ - >リンカー>入力 - >追加の実行可能なプロジェクト - >

プロパティ - >リンカー>一般 - >追加のライブラリディレクトリをクリックしてください依存関係

OutOfRangeを定義するライブラリへのパスが前者で、ライブラリ名が後者にあることを確認してください。

EDIT:投稿したコードから表示されるように、ライブラリ自体にヘッダをインポートするヘッダがある場合は、追加のディレクトリ部分を設定するだけで済みます。

最後に、使用しているライブラリのドキュメントを参照するか、フォーラムを起動する必要があります。

関連する問題