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

时间:2015-11-13 03:52:06

标签: c++ llvm llvm-clang

我试图基本上遵循llvm Kaleidoscope example

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

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

$  clang-cl main.obj llvm/lib/LLVMCore.lib llvm/lib/LLVMSupport.lib /MDd -o build\test.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)

build\test.exe : fatal error LNK1120: 1 unresolved externals

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

修改

事实证明,我需要更好地阅读the clang-cl documentation所说的内容:

  

要从命令行运行时启用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 as clang-cl的参数。然后它就像一个魅力。

1 个答案:

答案 0 :(得分:2)

您错过了CoTaskMemFree符号。通过Internet快速浏览一下,您就可以在链接线上找到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,而不是猜测您需要什么,而不是您的选择。