在C ++项目中使用LLVM库

时间:2016-03-19 18:24:12

标签: clang llvm

我目前在简单项目方面遇到问题(或者llvm-example)。我的任务要求我使用llvm库,但这并不像我希望的那样简单。

我使用git push origin master --forceLLVM构建MinGW GCC。构建之后,我可以使用clang编译。但是如果我创建简单的hello world类型的程序

CMake

并尝试使用

进行编译
#include "llvm-c/Core.h"

int main(int argc, char**argv)
{
  return 0;
}

我得到了

clang++ main.cpp

对于此示例,我已将In file included from main.cpp:1: ./llvm-c/Core.h:18:10: fatal error: 'llvm-c/ErrorHandling.h' file not found #include "llvm-c/ErrorHandling.h" 目录的内容复制到include目录中。在收到此问题后,我尝试检查这些标头,并且所有标头都位于main.cppllvm/,而不是纯相对地址。我认为这些库用于构建/生成llvm和libs供我使用实际上在llvm-c/目录中,这是我构建llvm的地方,但构建中的build目录只有大约1/2 include个文件。

我似乎无法在与此相关的文档中找到任何内容,甚至基本的llvm示例都希望包含*.h

等格式的库

修改

解决了包含问题之后,现在我得到了其他几个与mingw相关的问题。

这是新计划的外观。

llvm/Core.h

这会生成

#define __STDC_LIMIT_MACROS
#define __STDC_CONSTANT_MACROS

#include <llvm-c/Core.h>

using namespace std;

int main()
{
    LLVMModuleRef rff =  LLVMModuleCreateWithName("testname");
    return 0;
}

我使用d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(CommandLine.cpp.obj):CommandLine.cpp|| undefined reference to `__mingw_strtod'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(regerror.c.obj):regerror.c|| undefined reference to `__ms_vsnprintf'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(Path.cpp.obj):Path.cpp|| undefined reference to `SHGetKnownFolderPath@16'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(Path.cpp.obj):Path.cpp|| undefined reference to `_imp__CoTaskMemFree@4'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(Path.cpp.obj):Path.cpp|| undefined reference to `_imp___chsize_s'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(Path.cpp.obj):Path.cpp|| undefined reference to `FOLDERID_LocalAppData'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(Path.cpp.obj):Path.cpp|| undefined reference to `FOLDERID_LocalAppData'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(Path.cpp.obj):Path.cpp|| undefined reference to `FOLDERID_LocalAppData'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(Path.cpp.obj):Path.cpp|| undefined reference to `FOLDERID_LocalAppData'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(Path.cpp.obj):Path.cpp|| undefined reference to `FOLDERID_Profile'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(Path.cpp.obj):Path.cpp|| undefined reference to `FOLDERID_Profile'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(Path.cpp.obj):Path.cpp|| undefined reference to `FOLDERID_Profile'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(Path.cpp.obj):Path.cpp|| undefined reference to `FOLDERID_Profile'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(Path.cpp.obj):Path.cpp|| undefined reference to `FOLDERID_LocalAppData'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(Path.cpp.obj):Path.cpp|| undefined reference to `FOLDERID_LocalAppData'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(Path.cpp.obj):Path.cpp|| undefined reference to `FOLDERID_LocalAppData'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(Path.cpp.obj):Path.cpp|| undefined reference to `FOLDERID_LocalAppData'| d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.9.3\..\..\..\libLLVMSupport.a(TimeValue.cpp.obj):TimeValue.cpp|| undefined reference to `_localtime32'| 添加链接器。

尝试过的命令:

llvm-config --libs core

2 个答案:

答案 0 :(得分:2)

这些是WinAPI参考。最简单的方法是找到谷歌的文档,或者去mingw库目录(..\mingw530_32\i686-w64-mingw32\lib\)并找到文件。

所以

  • FOLDERID_LocalAppDatalibuuid.a中定义,因此请使用-luuid编译参数
  • _imp__CoTaskMemFree@4libole32.a中定义,因此请使用-lole32编译参数

对我来说g++ -std=c++11 -ID:\Devel\install\include main.cc -LD:\Devel\install\lib -lLLVMCore -lLLVMSupport -luuid -lole32

当我将llvm安装到D:\Devel\install

时,

正在运行

答案 1 :(得分:0)

如果您需要-llvm / include目录中的头文件而不是复制include目录的内容,您应该使用-I选项或构建系统所需的任何内容指定-llvm / include的包含路径。