【问题标题】:Default Preprocessor Definitions & Cross-Platform compiling默认预处理器定义和跨平台编译
【发布时间】:2013-03-29 17:30:38
【问题描述】:

我正在尝试寻找一种“干净的方式”来使用默认预处理器定义来确定应该根据平台和编译器编译我的代码的哪些部分。

我当前的测试设置涉及一台装有 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 方式? 有什么建议吗?

【问题讨论】:

  • 请注意,在 Windows 上使用 GCC 编译时,__GNUG__ 也设置为 true。最好使用__linux__。
  • @Ionic 想通了。我不确定是否需要 *nix 或 g++ 的定义。
  • 对不起,似乎是 *nix 特定的:gcc.gnu.org/wiki/Visibility
  • _MSC_VER 是检测 MSVC 的好定义。

标签: c++ visual-c++ g++ c-preprocessor


【解决方案1】:

在这些链接中有一个很好的 CompilerOperating SystemArchitecture 预处理器名称列表。您可以为您关心支持/检测的系统和编译器分支。此外,在boost/config/(参见boost/config/select_compiler_config.hpp 作为编译器标志的一个示例)中已经使用Boost 标头完成了很多这项工作。不是每个人都喜欢包括 Boost,这就是为什么第一组链接是通用的,来自特定于库的支持。

【讨论】:

    【解决方案2】:

    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();
    
    猜你喜欢
    • 2010-11-10
    • 2011-02-28
    • 2016-07-04
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    相关资源
    最近更新 更多