2013-03-29 59 views
1

我想通過使用默認的預處理器定義來確定我的代碼的哪些部分應該基於平臺和編譯器進行編譯的「乾淨方式」。默認預處理器定義和跨平臺編譯

我目前的測試設置包括一臺Windows計算機用Visual C++編譯器和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更理想一些? 建議?

+0

注在Windows上使用GCC進行編譯時,\ _ \ _ GNUG \ _ \ _也設置爲true。更好地使用\ _ \ _ linux \ _ \ _。 – Ionic

+0

@Ionic圖。我不確定我是否需要* nix或g ++的定義。 – TheDespite

+1

對不起,似乎* NIX特異性按照:http://gcc.gnu.org/wiki/Visibility – Ionic

回答

4

在這些鏈接上有一個Compiler,Operating SystemArchitecture預處理器名稱的不錯列表。您可以爲您關心支持/檢測的系統和編譯器進行分支。此外,使用Boost標頭在boost/config/(作爲編譯器標誌的一個示例,請參閱boost/config/select_compiler_config.hpp)中已完成了大量此工作。不是每個人都喜歡包括Boost,這就是爲什麼第一組鏈接是庫特定支持通用的原因。

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(); 
+0

([在問題中回答編輯並轉換爲社區wiki](http://meta.stackoverflow.com/questions/267434/what-is-the-woole-action-when-the-answer-to-a-問題 - 被添加到所述闕)) –