2012-01-16 21 views
0

デバイスのAPIのdllを書きたいと思います。私はdllの初心者なので、単純なテキストエディタで実装し、api用に作成したかったのです。 ヘッダファイルとcppファイルを作成しましたが、コードを実行するとエラーlnk2001が発生し、lnk1120が未解決の外部エラーです。C++ DLLリンカエラー

私は間違いをどこでやったのか分かりません。私は正しい方法で行っています。あなたが私を助けることができるかどうか疑問に思っていました。 tnx。

は、ここに私のヘッダファイル

// EditFuncsDll.h 
#include <cstdio> 
#include <vector> 
#include <string> 

namespace EditFuncs 
{ 
    class MyEditFuncs 
{ 
private: 
    static std::vector<std::string> MyTextBox; 

public: 
    static __declspec(dllexport) void Load(std::string command); 
    static __declspec(dllexport) void Save(std::string command); 
    static __declspec(dllexport) int Lines(); 
    static __declspec(dllexport) void Add(std::string command); 
    static __declspec(dllexport) void Remove(std::string command); 
    static __declspec(dllexport) void Insert(std::string command); 
    static __declspec(dllexport) int wc(std::string command); 
    static __declspec(dllexport) void GetInfo(); 
}; 
} 

で、私のcppファイルに私はちょうど私がヘッダファイルで宣言された関数を定義します。

、これらは私が

エラー25エラーLNK2001取得エラーです:未解決の外部シンボル「プライベート:静的クラスのstd ::ベクトル、クラスのstd ::アロケータ>、クラスのstd ::アロケータ、クラスのstd "MyTextBox @ MyEditFuncs @ EditFuncs @@ 0V?$ vector @ V?$ basic_string @ DU?$ char_traits @ D @ std @@ V?$ allocator @D @ 2 @@ std @@ V?$ allocator @ V?$ basic_string @ DU?$ char_traits @D @ std @@ V?$ allocator @D @ 2 @ std @@@ 2 @@ std @@ A)C: \ Users \ Lucy \ Desktop \ Erfan \ Text_Editor_DLL \ Text_Editor_DLL \ EditFuncsDll.obj Text_Editor_DLL

および

エラー26エラーLNK1120:1つの未解決の外部C:\ Users \ユーザールーシー\デスクトップ\ ERFAN \ Text_Editor_DLL \デバッグ\ Text_Editor_DLL.dll Text_Editor_DLL

+0

@Assemんだけど、これがあるのcppファイル内の関数を定義していますメインのcppではなくヘッダのcppファイル。私はそこに定義するべきだとは思わない。したほうがいい? – Erfan

+0

対応するcppで宣言されたすべての静的メンバー変数を定義する必要があります。 .cppファイル内の関数の定義の前に記述してください。 私は前のコメントに書いたものを修正する必要があります: std :: vector EditFuncs :: MyEditFuncs :: MyTextBox; – Assem

+0

@Assem ここに私のcppの一部です '// EditFuncsDll.cpp #include "EditFuncsDll。H」 の#include の#include 名前空間stdを使用して、 名前空間EditFuncs { \t静的のstd ::ベクトル MyTextBoxを、 \t空隙MyEditFuncs ::負荷(stringコマンド) \t { \t \tストリングファイル名; \t \t //ファイルの名前はコマンドの5文字目から始まり、最後に移動します \t \tファイルname = command.substr(5、command.size()); \t \t ifstream inFile; \t \t inFile.open(filename); ' あなたが言ったことによると、私はその静的変数の定義を追加しましたが、それでも私は同じエラーを受け取ります。なぜか分からない! – Erfan

答えて

1

あなたのcppの頭は次のようにする必要があります:

あなたのDLLのヘッダファイルで
#include "EditFuncsDll.h" 
#include <iostream> 
#include <fstream> 
using namespace std; 
namespace EditFuncs 
{ 
    std::vector<std::string> EditFuncs::MyEditFuncs::MyTextBox; 
    void MyEditFuncs::Load(string command) 
    { 
     string filename; // The name of the file starts at the fifth character of the command and goes to the end 
     filename = command.substr(5,command.size()); 
     ifstream inFile; 
     inFile.open(filename); 
     . 
     . 
     . 
+0

OMGその働き:Dありがとう。だから私は静的なメンバーを定義するたびに、私は同様に対応するcppで定義する必要があります。右?再度、感謝します。 – Erfan

+0

これは@Erfanです:) – Assem

0

あなたはDLLのクライアントのため__declspec(dllimport)に展開プリプロセッサマクロを使用すると、DLLを実施しているコードの__declspec(dllexport)に(すなわちDLL .cppファイル)。あなたのDLLヘッダを#including前に、あなたのDLLのソース.cppファイル(複数可)で

// EditFuncsDll.h 

#ifdef EDIT_FUNCS_DLL_IMPLEMENTATION 
#define EDIT_FUNCS_DLL __declspec(dllexport) // for DLL implementation 
#else 
#define EDIT_FUNCS_DLL __declspec(dllimport) // for clients 
#endif 

class EDIT_FUNCS_DLL MyEditFuncs 
{ 
... 
}; 

、次のことができ#define EDIT_FUNCS_DLL_IMPLEMENTATION

// EditFuncsDll.cpp 

#define EDIT_FUNCS_DLL_IMPLEMENTATION 
#include "EditFuncsDll.h" 

// ... implementation code 
+0

ありがとう、実際に私は確信していません、正確にdllimportは何ですか。私はdllのチュートリアルとしてmsdnを使用していますが、時にはなぜ、いつ、どうすれば使用するべきか分かりません。私はDLLについての良いチュートリアルを探していますが、それを見つけられませんでした。ちなみに、コードは正常に構築されますが、DLLを実行すると、DLLの戻り値としてプログラムがクラッシュし、なぜ理解できませんか???これらのプリプロセッサマクロからはできますか? – Erfan

+0

@Erfan:私はCodeProjectからこれらの記事を提案したいと思います:[初心者向けのRegular DLL Tutor](http://www.codeproject.com/Articles/6351/Regular-DLL-Tutor-For-Beginners)と[HowTo:Export DLLからのC++クラス](http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL)を参照してください。クラッシュの原因は異なる可能性があります。たとえば、同じVC++コンパイラと同じCRTフレーバを使用して、EXEとDLLの両方をビルドしていますか? –

+0

はいVS2011を使用してDLLと.exeをビルドしています。私はデバイス用のAPIを作成しています。リンクをありがとう、興味深いチュートリアルは見つかりませんでした。それはあまりにも古くても、ちょうどHello WorldのDLLであったかもしれません – Erfan