我试图基本上遵循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
的参数。然后它就像一个魅力。
答案 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
,而不是猜测您需要什么,而不是您的选择。