【问题标题】:Detect msvc standard library检测 msvc 标准库
【发布时间】:2016-05-19 18:44:55
【问题描述】:

如何通过预处理器可靠地检测 msvc 标准库?

不是带有检查 _MSC_VER 的 msvc 编译器,而是另一个使用该库的编译器?

我正在寻找特定的预处理器宏,例如 mingw 中的 __MINGW32__ ,mingw-w64 中的 __MINGW64_VERSION_MAJOR

这只是学术问题。

【问题讨论】:

  • 您是否在问是否有办法在某些编译对象中检测到这一点? (.lib、.dll、.so、.o、.exe 等等)
  • 你说的是像 mingw-gcc 这样的案例,它会创建链接到 MSVCRT.DLL 的可执行文件?
  • 既然这只是一个学术问题,我建议你放弃它。没有可靠的方法(据我所知)来做你想做的事。你为什么要首先?编译器和它们的标准库是相当紧密耦合的——不要试图将一个与另一个一起使用......
  • 检测特殊库行为的常用方法是autotools'autoconf——预编译步骤编译并运行检测特殊行为的测试代码,编写头文件其中定义了指示检测到哪些行为的宏,并且应用程序代码包括该自动生成的标头。
  • 我询问特定的预处理器宏,例如 mingw 中的 __MINGW32__ ,mingw-w64 中的 __MINGW64_VERSION_MAJOR

标签: c visual-c++


【解决方案1】:

首先,不要使用其他编译器编译 msvc 库,它们取决于 msvc 编译器的行为和定义。

其次,在每个 msvc 标准库头文件中都没有任何东西可以用来测试。即使有它也会定义实现,也可能由另一个标准库实现定义。

这就是说#include <iostream> 几乎是最接近通用的。您可以查看此文件以找到可以关闭的足够独特的定义。例如_IOSTREAM_

【讨论】:

  • clang 可以使用 msvc 库,但带有一些特定标志,尝试模拟 msvc 编译器。 clang.llvm.org/docs/MSVCCompatibility.html
  • 如果这里没有通用的解决方案,那么它是更好的方法。
  • 所以您正在尝试确定哪个编译器正在使用这些库?如果是这样,那么 _MSC_VER 正是您想要的,它是由编译器定义的,而不是标准实现:msdn.microsoft.com/en-us/library/b0084kay.aspx
  • 不,我想检测使用了哪些标头,而不是编译器。我不想要 _MSC_VER。
  • 所以听起来你这样做的原因是因为你使用的 makefile 可能会也可能不会使用 msvc。如果是这种情况,也许您可​​以使用您的 makefile 来传递定义?
猜你喜欢
  • 2021-06-25
  • 1970-01-01
  • 2015-06-15
  • 2017-08-10
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
相关资源
最近更新 更多