0

私の目的はdllとlibファイルを作成することなので、このガイド
に従います 1)VSで新しいwin32コンソールアプリケーションプロジェクトを作成し、「アプリケーションタイプ」としてDLLを選択し、プロジェクトを空
にしました2)データベースを作成しようとしていますC++で。したがって、関数宣言のみを含む5つのヘッダーがあります。
3)Database.hは私のトップヘッダーで、次のようになります。

#ifdef DBDLL_EXPORTS
#define DBDLL_API __declspec(dllexport) 
#else
#define DBDLL_API __declspec(dllimport) 
#endif
#ifndef __Database_H
#define __Database_H


#include "Table.h"

class DBDLL_API Database { ... };
#endif

4)ヘッダーだけで、プロジェクトをコンパイルしてみました。コンパイルされましたが、プロジェクトフォルダのどこにもDLLまたはLibが表示されません。どうすれば作成できますか?

4

1 に答える 1

3

これは、ヘッダーがコンパイルされていないためです-CPPファイルのみがコンパイルされます(ヘッダーをプルします-ソースファイルとそれがプルするすべてのヘッダーは「翻訳ユニット」と呼ばれ、実際にコンパイルされるものです(他のTU))。

したがって、実際には、ビルドシステムは、空のプロジェクトをビルドしていると見なし、この場合は何も生成しません。ヘッダーがプルインされてコンパイルされた場合でも、エクスポートされたシンボルが実際にどこかで参照されていない限り、最適化される可能性があることに注意してください。このような場合、(空の)DLLは取得されますが、.libファイルは取得されません(DLLに何かが含まれる前に、依存プロジェクトがこれを探している場合、エラーが発生する可能性が.libあります)。

ヘッダーで宣言された関数を実装するいくつかのCPPファイルを作成する必要があります。ヘッダーにすべてがあり、CPPファイルがまったく必要ない場合は、DLLを使用しても意味がありません。(他の依存関係を必要とせずに、他のプロジェクトにヘッダーを含めることができるためです。)

最後に、インクルードガード(#ifndef ...)は、DLLエクスポートマクロを含むヘッダー全体を含む必要があります。そうしないと、最終的にマクロ再定義の警告が表示されます。

インクルードガードの代わりに使用することをお勧めし#pragma onceます。これは、より単純で、ほとんどすべてのコンパイラで認識されるためです。また、DLLマクログープを独自のヘッダー(「dllmacros.h」など)に配置し、必要な場所に含めます(これにより重複が減ります)。

于 2013-02-10T23:58:18.860 に答える