5

現在、アンマネージ C++ で記述されたコンソール アプリケーションがあります。ソース コードは、エントリ ポイントmainとその他の関数で構成されています。他のプロジェクト、特にマネージ C++ から使用できるように、このコードから DLL を作成する必要があります。(別の質問: この目的のためにラッパー クラスを作成する必要がありますか?)

マネージ/アンマネージ C++ と DLL の作成についてほとんど何も知らないので、このチュートリアルに従い、VS2010 のみを使用して (CMake を使用せずに) シンプルな Hello World DLL を起動して実行することができました。

ただし、私のこのプロジェクトには多くの依存関係 (ポイント クラウド ライブラリなど) があるため、 PCL チュートリアルで説明されているように、通常は CMake を使用して Visual Studio 2010 ソリューションを生成し、それを実行可能ファイルにビルドします。CMake を使用して、DLL に組み込まれる VS2010 プロジェクトをビルドするにはどうすればよいですか?

私の問題を要約するには:

  1. 多くの依存関係を必要とするアンマネージ C++ コードのプロジェクトがあります。
  2. このコードから、マネージド C++ から呼び出すことができる DLL を作成したいと考えています。

追加情報: Windows 7、Visual Studio 2010 Ultimate、CMake 2.8.10.2

編集: 行を変更して CMake を使用しましたが、期待どおりに機能しました。これはヘッダー ファイルに追加したものですが、正しい方向に進んでいますか?

MyCode.h

#ifdef MyLib_EXPORTS
#define API_DECL __declspec( dllexport )
#else 
#define API_DECL __declspec( dllimport )

#include <iostream>
#include <pcl/...>
etc...

API_DECL void myFirstFunction();
API_DECL void mySecondFunction();
#endif

MyCode.cpp: ソース ファイルに変更を加えていませんが、変更する必要がありますか?

4

1 に答える 1

5

残念ながら、マネージ コードの部分についてはお手伝いできませんが、CMake で DLL を作成する方法は次のとおりです。

まず第一に、使用する代わりに

`ADD_EXECUTABLE( YourLib SHARED yourclass.cpp yourclass.h )` 

あなたのCMakeLists.txt中で、使用

`ADD_LIBRARY( YourLib SHARED yourclass.cpp yourclass.h )`

これにより、実行可能ファイルではなく DLL を作成するようにソリューションが構成されます。

ただし、プロジェクトでこの DLL を使用できるようにするには、使用するシンボルをエクスポートする必要があります。これを行うには__declspec( dllexport )、クラスや関数の宣言に追加する必要があります。ライブラリをビルドすると、2 つのファイルが生成されます。dll.lib。後者は、このライブラリを他のプロジェクトで使用する場合に必要な、いわゆるインポート ライブラリです。は.dll実行時に必要になります。

ただし__declspec( dllimport)、ライブラリを使用する場合は、(ではなく)を使用する必要がありますdllexport。2 つのヘッダー ファイルを使用しないようにするための通常の方法は、プリプロセッサを使用することです。YourLibrary_EXPORTS defineCMakeは、ライブラリ プロジェクトにを提供することで実際に役立ちます。

要約する:

#ifndef YOUR_CLASS_H
#define YOUR_CLASS_H

#ifdef YourLib_EXPORTS
#define API_DECL __declspec( dllexport )
#else 
#define API_DECL __declspec( dllimport )
#endif

class APIDECL YourClass  {
   void foo();
   void bar();
};

#endif // YOUR_CLASS_H

EDIT:C(およびC関数を使用できる言語)からこれらの関数を使用できるようにしたい場合は、宣言を次のようにラップする必要がありますextern "C" {

extern "C" {
    API_DECL void myFirstFunction();
    API_DECL void mySecondFunction();
}
于 2013-01-22T15:46:10.620 に答える