【发布时间】:2018-05-17 10:07:28
【问题描述】:
如果我创建一个简单的库(使用 CMake 构建):
foo.h
#pragma once
#include <functional>
void foo(std::function<void()> handler);
foo.cpp
#include "foo.h"
void foo(std::function<void()> handler)
{
handler();
}
然后创建一个单独的CMake项目编译一个可执行文件:
#include "foo.h"
#include <cstdlib>
#include <iostream>
int main()
{
foo([&]()
{
std::cout << "hello" << std::endl;
});
return EXIT_SUCCESS;
}
然后在 Release 或 RelWithDebInfo 中使用 MSVC(使用最新平台 SDK 10.0.17134.12)编译库(记住我使用的是 CMake),然后使用 Clang 6 编译可执行文件(最新的 Windows 平台不支持 Clang 5与 Visual Studio 17.7 https://blogs.msdn.microsoft.com/vcblog/2018/05/07/announcing-msvc-conforms-to-the-c-standard/ 捆绑的 SDK 也使用 Release 或 RelWithDebInfo,然后我得到由 std::function 析构函数触发的堆损坏。
为了可靠地触发堆损坏,我可以使用gflags。
gflags -p /enable "myexe.exe" /full
它在以前的平台 SDK 上与 Clang 5 配合良好(标准 Clang 可从 LLVM 下载,而不是 Microsoft 的版本)。我假设这是 ABI(或类似)问题或错误。将这一切提炼出来并获得最低限度的可验证复制需要一段时间。有没有人对从这里拿它有什么建议?
【问题讨论】:
-
有没有标准的c++ ABI?上次我检查没有任何标准。 AFAIK clang 和 gcc 可以生成兼容的代码,但它们在自己的版本之间通常不能完全向后兼容。您的问题是已知问题,还是我误解了什么?
-
@luk32,clang-cl.exe 旨在与 msvc.exe ABI 兼容
标签: c++ visual-c++ clang abi std-function