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

于 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 回答