【问题标题】:CMake project for Eclipse+MinGW using Visual Studio defines instead of GCCEclipse+MinGW 的 CMake 项目使用 Visual Studio 定义而不是 GCC
【发布时间】:2016-09-03 13:33:54
【问题描述】:

我的问题与帖子非常相关 Defined macro not recognized

我编写了一个 CMakeLists 文件,以便能够为 OS X(主要是 Eclipse,但有时使用 Xcode)和 Windows(Visual Studio)构建我的项目。今天在为 Windows + MinGW 创建我的项目时出现了这个问题。我在windows中使用定义的_WIN32来启用一些功能,即

bool Normal::HasNaNs() const
{
#ifdef _WIN32
    return _isnan(x) || _isnan(y) || _isnan(z);
#else
    return isnan(x) || isnan(y) || isnan(z);
#endif
}

但是,使用 Eclipse+MinGW 组合,代码进入 ifdef 部分,而不是(我希望/认为应该是正确的)进入 else 部分。我认为 Visual 是唯一具有 _isnan() 功能的。 那么,什么是检查 Windows+VS、Windows+MinGW、OSX 的更可靠的方法呢?

【问题讨论】:

  • 您的另一个问题是关于非标准扩展(M_PI 不是 C 的一部分)。 isnan 是 C++ 的一部分,但 C++11。如果您使用的是 CMake,那么这些预处理器定义是完全错误的方法。为什么不在 CMake 级别执行此操作?
  • 我的阅读量刚好够让我的 CMake 文件用于创建项目。我的项目发生了变化,出现了新的需求。您能否提供一个链接,让我可以阅读并了解如何在 CMake 级别实现这一目标?
  • 你想知道但又不敢问的一切:Pre-defined Compiler Macros

标签: c++ cmake


【解决方案1】:

_MSC_VER 是检查您是否正在被 Visual Studio 编译的最佳方式:

https://msdn.microsoft.com/en-us/library/b0084kay.aspx

要检查 MinGW(请参阅评论以获取更多信息),您可以使用:

#ifdef __GNUC__
#ifdef __MINGW32__

根据这个答案:

https://stackoverflow.com/a/17493838/493106

然后__APPLE__ 用于 os x。

https://stackoverflow.com/a/2166491/493106

【讨论】:

  • 请注意,__GNUC__also defined for llvm,因此如果编译器真的是 gcc/g++ 并不总是足以明确理解(尽管这里我们更具体地谈论 MinGW)
  • 很高兴知道,我会在答案中指出您的评论,以防万一有人没有看..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多