【问题标题】:Missing CoTaskMemFree when building LLVM example on Windows在 Windows 上构建 LLVM 示例时缺少 CoTaskMemFree
【发布时间】: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


    【解决方案1】:

    您缺少 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,而不是猜测你需要什么,而是你自己的选择。

    【讨论】:

    • 是的,我完全错过了 CoTaskMemFree 就是缺少的东西。另外,我不知道为什么,但 llvm-config 没有在 windows 上附带 clang,而且似乎没有哪里可以下载它。所以我一直试图不依赖它,因为我不想让其他人为了得到它而进行 3 小时的构建。此外,我的 franken-system 似乎安装了太多的视觉工作室,而 llvm-config 似乎无法构建正确的路径。我正在卸载焦土,然后我将尝试重新获得最小的依赖。这非常令人沮丧。
    • llvm-config 是 LLVM 源代码树的一部分,它应该默认构建并最终在您的“bin”目录中,无论您在计算机上构建 LLVM 的任何位置。我看不出它不能在 Windows 上构建的任何理由。该工具的源代码位于 LLVM 结帐中的 tools/llvm-config 中。当然,您需要更新您的 %PATH% 才能看到它。
    • 它确实是在 Windows 上构建的,但如果它附带 clang 安装程序会非常好,因为如果没有它,你似乎无法真正使用 clang,并且在我的机器上构建 llvm 需要 3 个小时。
    • 所以事实证明我有点困惑,因为似乎 clang-cl 能够自动将包含路径添加到 windows sdk,但它也不会添加 sdk lib 路径。但是它确实在 clang-cl 文档页面上说:To enable clang-cl to find system headers, libraries, and the linker when run from the command-line, it should be executed inside a Visual Studio Native Tools Command Prompt or a regular Command Prompt where the environment has been set up using e.g. vcvars32.bat. 这将完全解决我的问题。我希望不必这样做,因为我想使用 bash
    • 我也有同样的想法,我最终弄明白了,现在它也可以在 bash 中使用:github.com/justinmchase/node-clang-build/blob/master/lib/…
    猜你喜欢
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 2012-02-05
    • 2013-12-23
    • 2014-01-30
    • 2012-09-18
    • 2013-08-20
    • 1970-01-01
    相关资源
    最近更新 更多