2010-12-06 13 views
4

申し訳ありませんが、ここに問題があります。私のC++ APIの知識を向上させるために、私はライブラリファイルの種類についてもっと学びました。私は静的ライブラリをかなりよく理解しています。ライブラリをプロジェクトにリンクするだけで、その内容はコンパイルおよびリンクされたときにバイナリの中に置かれます。しかし、ダイナミックライブラリを使用しようとしたときに問題が発生しました。 __declspec関数を使用してDLLファイルを正常にコンパイルし、externブロックを作成できました(C++に正常にエクスポートできます)。しかし、ファイルをリンクしようとすると問題が発生します。 Web全体で見た複数のチュートリアルに基づいて、フォワード定義のヘッダーを作成し、それを実行可能プロジェクトに組み込みます。次に、インポートするライブラリのパスとともに、プロジェクトのビルド設定に検索ディレクトリを追加します。次に、プロジェクトをビルドすると、オブジェクトファイルがコンパイルされているためにリンカエラーが発生します。「-l [ファイルへのパス]」が見つかりません。もっと多くの設定ができますか? Code :: Blocks(私は現在、Eclipse CDTプラグインを使用しています)が同様のリンクエラーを生成したため、私のコンパイラ(MinGW)と何か関係があると思います。C++ DLLはリンクされませんか?

コードを見る必要がある場合は、以下で説明します。

// EXE: main.cpp 
#include <iostream> 
#include "DLLTutorial.h" 

int main() 
{ 
    Function(); 
    std::cout << "1 + 3:\t" << Add(1, 3); 
} 


// DLL: DLLTutorial.cpp 
#define DLL_EXPORT 
#include <iostream> 
#include "DLLTutorial.h" 

extern "C" 
{ 
    DLLCOMP int Add(int a, int b) 
    { 
     return a + b; 
    }; 

    DLLCOMP void Function(void) 
    { 
     std::cout << "DLL Called!\n"; 
    }; 
}; 


// DLL: DLLTutorial.h 
#ifndef DLLTUTORIAL_H_ 
#define DLLTUTORIAL_H_ 

#include <iostream> 

#ifdef DLL_EXPORT 
    #define DLLCOMP __declspec(dllexport) 
#else 
    #define DLLCOMP __declspec(dllimport) 
#endif 

extern "C" 
{ 
    DLLCOMP int Add(int a, int b); 
    DLLCOMP void Function(void); 
}; 


#endif /* DLLTUTORIAL_H_ */ 

これは、ウェブサイトから使用した非常に簡単なサンプルコードです。私は実行ファイルを適切にリンクすることができないので、私に与えられる助言に感謝します。

また、関連する質問があります。いくつかのチュートリアルをオンラインで読むと、Windows/Microsoft特有の__declspec関数についていくつかの言及がありました。これは本当ですか?この場合、他のオペレーティングシステムで使用するにはどうすればよいでしょうか?

答えて

2

dllをビルドする場合は、会社の.libファイル「implib」も作成します。このファイルをexeで静的にリンクする必要があります。

EDIT:__cdeclspec(...)は実際にはMicrosoftです。他のプラットフォームについては知りません。

+0

私はリンカがあなたのために静的ライブラリを構築しないと思います(少なくとも、適切な設定がない場合)。なぜなら、プロジェクトのビルドディレクトリのどこにでも対応するlibファイルが見つかりません。 – B3tturTh3nU

+0

dllファイルの近くを見てください(あなたのユーザー名を誤ってパスワードとして使用しましたか?) – ruslik

+0

これを防ぐリンカ設定があります。私はMinGwを使用していません。また、使用できるdefファイルも存在する可能性があります。 –

0

ライブラリを検索する場所とコンパイラをコンパイラに指示する必要があります。 GCCとMinGWの両方では、インクルードには-I、ライブラリには-Lを使用してこれを実現します。私はあなたが.lib(または、通常は* nixとGCCにあるように.a)を生成するために必要ではないと思っています.GCCはあなたの関数をdllで見つけることができます。例えば

、ビルドとリンクして共有ライブラリ:

g++ -oapp.exe app.cpp -lmy_dll -L. 
:あなたのlibを使用する

g++ -shared -olibmy_dll.dll my_dll.cpp 

を次に、すべてのファイルが同じディレクトリにあると仮定すると、GCCを構築し、exeファイルをリンクして伝えます

-Lの違いに注意してください.GCCにはどのlibを使用するかを指示しますが、もう一方は使用する場所を指示します。 Eclipse CDTでは、プロジェクトプロパティ - > C/C++ビルド - >設定 - > MinGW C++リンカー - >ライブラリでこれらの設定を見つけることができます。

また、__declspecはMinGWによって認識されていますが、私はMicrosoftとにかくそれが固有だと思います。

関連する問題