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

C++ 在Windows上构建LLVM示例时缺少CoTaskMemFree,c++,llvm,llvm-clang,C++,Llvm,Llvm Clang,我试图从本质上遵循这个原则 我在窗户上。我根据网站上的说明从源代码构建了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/IR

我试图从本质上遵循这个原则

我在窗户上。我根据网站上的说明从源代码构建了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());
#包括“llvm/ADT/stlexts.h”
#包括“llvm/IR/IRBuilder.h”
#包括“llvm/IR/LLVMContext.h”
#包括“llvm/IR/Module.h”
#包括“llvm/IR/Verifier.h”
std::unique_ptr module=llvm::make_unique(“我的酷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
LLVMSupport.lib(Path.obj):错误LNK2019:未解析的外部符号
__函数“bool”中引用的imp_CoTaskMemFree
llvm::sys::path::getKnownFolderPath(结构GUID,类
llvm::SmallVectorImpl&“(?)?
getKnownFolderPath@path@sys@llvm@@“你知道吗?”@AEAV$SmallVectorImpl@D@3@@Z)
build\test.exe:致命错误LNK1120:1未解析的外部
要定义此函数,我必须链接到哪个库?我可以在我构建的代码中看到实现。我是否需要以特定的方式构建llvm才能导出它

编辑:

事实证明,我需要更好地阅读上面的内容:

要使clang cl在从命令行运行时能够查找系统头、库和链接器,应在Visual Studio本机工具命令提示符或常规命令提示符内执行该命令,其中已使用vcvars32.bat等工具设置了环境


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

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

我没有访问Windows计算机进行测试的权限,但在我的计算机上,我可以运行
llvm config--system libs
,它可以获取所有必要的东西。使用名称空间llvm添加
并添加存根
main
函数,我可以使用(在OSX上)轻松构建此示例:


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

是的,我完全没有意识到CoTaskMemFree是缺少的。另外,我也不知道为什么,但llvm配置在windows上并没有附带clang,而且似乎没有下载的地方。所以我一直在努力不依赖它,因为我不想让其他人仅仅为了得到它而进行3小时的构建。另外,我的franken系统似乎安装了太多的visual Studio,llvm配置似乎无法构建正确的路径。我正在进行焦土卸载,然后我将尝试重新获得最小的依赖关系。这非常令人沮丧。
llvm config
是llvm源代码树的一部分,它在默认情况下应该构建,并在您在计算机上构建llvm的任何位置都会出现在“bin”目录中。我看不出它为什么不能在Windows上运行。该工具的源代码位于llvm签出的
tools/llvm config
中。当然,你需要更新你的
%PATH%
,使其可见。它是在windows上构建的,但如果它与clang安装程序一起提供,那就太好了,因为如果没有它,您似乎无法真正使用clang,在我的机器上构建llvm需要3个小时。因此,我有点困惑,因为clang cl似乎能够自动将包含路径添加到windows sdk,但它也不能添加sdk库路径。但是,它在clangcl文档页面上确实指出:
要使clangcl能够在从命令行运行时查找系统头、库和链接器,它应该在Visual Studio本机工具命令提示符或常规命令提示符内执行,其中已使用vcvars32.bat等工具设置了环境。
这将完全解决我的问题。我希望不必这样做,因为我想使用bashI也有同样的想法,我最终找到了答案,现在它也在bash中工作:
c++ `llvm-config --cxxflags` main.cpp `llvm-config --ldflags --system-libs --libs core support`