1

デフォルトのプリプロセッサ定義を使用して、プラットフォームとコンパイラに基づいてコードのどの部分をコンパイルする必要があるかを判断する「クリーンな方法」を見つけようとしています。

私の現在のテスト セットアップには、Visual C++ コンパイラを搭載した Windows マシンと g++ コンパイラを搭載した Debian が含まれています。

現在、私は次のようなものを持っています:

#if defined (__GNUG__)
    #define ASMMath_EI __attribute__ ((__visibility__("default")))
#elif defined (WIN32)
    #ifdef ASMMath_EXPORTS
        #define ASMMath_EI __declspec(dllexport)
    #else
        #define ASMMath_EI __declspec(dllimport)
    #endif
#endif

extern void ASMMath_EI AsmProblemOne();

そしてそれは機能しますが、私がチェックできるより良い定義がいくつかあるかもしれませんし、そうでなければならないと思います. それとも、CMake を使ったもっと理想的な方法でしょうか? 提案?

4

2 に答える 2

4

これらのリンクには、 CompilerOperating System、およびArchitectureプリプロセッサ名の優れたリストがあります。サポート/検出したいシステムとコンパイラに分岐できます。さらに、この作業の多くは、Boost ヘッダーを使用して既に行われています (コンパイラ フラグの例をboost/config/参照)。boost/config/select_compiler_config.hppBoost を含めることを誰もが好むわけではないため、最初のリンク セットはライブラリ固有のサポートからの汎用的なものです。

于 2013-03-29T18:38:00.323 に答える
0

質問編集でOPから回答:

私が集めたものから、これを実装するための理想的な方法は次のとおりです。

// MasterHeader.h
#if defined _MSC_VER // Defined by visual studio
  #define PROJ_TMP_DLL_IMPORT __declspec(dllimport)
  #define PROJ_TMP_DLL_EXPORT __declspec(dllexport)
#else
  #if __GNUC__ >= 4 // Defined by GNU C Compiler. Also for C++
    #define PROJ_TMP_DLL_IMPORT __attribute__ ((visibility ("default")))
    #define PROJ_TMP_DLL_EXPORT __attribute__ ((visibility ("default")))
  #else
    #define PROJ_TMP_DLL_IMPORT
    #define PROJ_TMP_DLL_EXPORT
  #endif
#endif

#ifdef PROJ_EXPORTS
    #define PROJ_API PROJ_TMP_DLL_EXPORT
#else
    #define PROJ_API PROJ_TMP_DLL_IMPORT
#endif

-

// File.h
#include "MasterHeader.h"

extern void PROJ_API SomeFunction();
于 2016-06-30T14:44:02.293 に答える