0

私のDLLプロジェクトには、次のファイル構造があります。

// common_header.h //////////////////

   extern int  CommonVar = 0;
   extern bool CommonVar2 = false;

   EXPORT_API void ThisFunction();
   EXPORT_API bool ThisOtherFunction();


// library_part1.cpp ////////////////
   #include "common_header.h"

   EXPORT_API void ThisFunction() {
       if (CommonVar2) CommonVar++;
   }

// library_part2.cpp ////////////////
   #include "common_header.h"

   EXPORT_API bool ThisOtherFunction() {
       if (CommonVar>2) return true;
       return false;
   }

私が言ったように、私は Microsoft Visual Studio を使用してこれを DLL にビルドします。もちろん、これらの変数がオブジェクト ファイルで 2 回検出されるという事実に関連するリンク エラーが発生します。これは、.cpp ごとに .obj が作成され、各 .cpp に同じヘッダーが含まれているため、変数もエクスポートされるためです。あなたはそれを得る。さて、これに対する解決策があるかどうか疑問に思っているのは、.CPP と extern の両方でこれら 2 つの変数を共通に保つことができるかどうかです (少なくとも、DLL を使用するアプリケーションからそれらを読み取ることができるようにするためです)。もちろん、それらは .obj ファイルで 1 回だけ宣言する必要があります。たぶん、そのためのプリコンパイラコマンドがあります(#pragma onceヘッダーの場合など)

4

1 に答える 1

0

見つけた。これが解決策です:

// common_header.h //////////////////

extern EXPORT_API int  CommonVar;
extern EXPORT_API bool CommonVar2;

EXPORT_API void ThisFunction();
EXPORT_API bool ThisOtherFunction();


// library_part1.cpp ////////////////
#include "common_header.h"

EXPORT_API int  CommonVar = 0;
EXPORT_API bool CommonVar2 = false;

EXPORT_API void ThisFunction() {
   if (CommonVar2) CommonVar++;
}

// library_part2.cpp ////////////////
#include "common_header.h"

EXPORT_API bool ThisOtherFunction() {
   if (CommonVar>2) return true;
   return false;
}
于 2013-03-28T18:34:37.740 に答える