在Windows上构建LLVM示例时缺少CoTaskMemFree

Missing CoTaskMemFree when building LLVM example on Windows

本文关键字:CoTaskMemFree Windows 构建 LLVM      更新时间:2023-10-16

我试图从本质上遵循llvm Kaleidoscope的示例。

我在Windows上。我根据网站上的说明从源代码构建了llvm。它花了很长时间,但最终成功构建(至少没有错误)。

然后用我自己的代码运行这个命令:

$  clang-cl main.obj llvm/lib/LLVMCore.lib llvm/lib/LLVMSupport.lib /MDd -o buildtest.exe

我的main.cpp代码中包含以下内容:

#include "llvm/ADT/STLExtras.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Verifier.h"
std::unique_ptr<Module> module = llvm::make_unique<Module>("my cool jit", getGlobalContext());

我没有得到任何解析器错误,但我从链接器中得到了一个错误,我一生都无法弄清楚:

LLVMSupport.lib(Path.obj) : error LNK2019: unresolved external symbol
__imp_CoTaskMemFree referenced in function "bool __cdecl 
llvm::sys::path::getKnownFolderPath(struct _GUID,class 
llvm::SmallVectorImpl<char> &)" (?
getKnownFolderPath@path@sys@llvm@@YA_NU_GUID@@AEAV?$SmallVectorImpl@D@3@@Z)
buildtest.exe : fatal error LNK1120: 1 unresolved externals

要定义此函数,我必须链接到哪个库?我可以在我构建的代码中看到实现。我需要以特定的方式构建llvm才能导出吗?

编辑:

事实证明,我需要更好地阅读clang cl文档,其中写道:

要使clang cl在从命令行运行时能够查找系统头、库和链接器,它应该在Visual Studio Native Tools命令提示符或常规命令提示符中执行,其中环境是使用例如vcvars32.bat设置的。

事实证明,这解决了我的问题。我有点困惑,因为clang-cl似乎可以自动解析sdk-include和工具路径,但不能解析lib路径。我也不想使用CMD来驱动clang,所以我使用bash,因为我无法轻松运行vcvar32.bat。我通过基本上复制vcvar32.bat$PATH$INCLUDE$LIB$LIBPATH环境变量所做的操作,并将Ole32.Lib作为参数添加到clang-cl中,解决了我的问题。然后它就像一个符咒。

您缺少CoTaskMemFree符号。快速浏览一下互联网,就会发现你的链接线上需要Ole32系统库。

我没有访问Windows机器进行测试,但在我的电脑上,我可以运行llvm-config --system-libs,它可以提供所有必要的东西。在添加了using namespace llvm;并添加了一个存根main函数之后,我可以很容易地使用(在OSX上)构建这个示例:

c++ `llvm-config --cxxflags` main.cpp `llvm-config --ldflags --system-libs --libs core support`

我经常建议您只指定--libs,而不是猜测您需要什么,而是您的选择。