【发布时间】:2015-11-13 03:52:06
【问题描述】:
我试图从本质上关注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 本地工具命令提示符或已设置环境的常规命令提示符中执行使用例如vcvars32.bat.
事实证明,这解决了我的问题。我有点困惑,因为clang-cl 似乎可以自动解析 sdk 包含和工具路径,而不是 lib 路径。我也不想使用 CMD 来驱动 clang,所以我使用 bash 无法轻松运行 vcvar32.bat。我通过将vcvar32.bat 对$PATH、$INCLUDE、$LIB 和$LIBPATH 环境变量所做的复制并将Ole32.Lib 作为参数添加到clang-cl 来解决我的问题。然后它就像一个魅力。
【问题讨论】:
标签: c++ llvm llvm-clang