在Windows上构建LLVM示例时缺少CoTaskMemFree
Missing CoTaskMemFree when building LLVM example on Windows
我试图从本质上遵循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
,而不是猜测您需要什么,而是您的选择。