链接 LLVM 库问题 & 使用 clion & llvm & cmake 构建 IR 问题

问题描述 投票:0回答:1

我目前正在学习LLVM。我正在关注《LLVM Essentials》。在“Creating an LLVM Moudle”中有这样的内容:

static llvm::LLVMContext context;
Module *module = new Module("Module",context); 
module->dump();. 

编译后我最终得到了

Undefined symbols for architecture arm64:
  "llvm::Module::dump() const", referenced from:
      _main in main.cpp.o
ld: symbol(s) not found for architecture arm64` .

我使用的是 macOS 12.0.1,并且我使用 homebrew 安装 llvm-17。我还使用 clion 作为我的 IDE,cmake 配置为:

cmake_minimum_required(VERSION 3.16)
project(Demo)
set(CMAKE_CXX_STANDARD 17)


find_package(LLVM REQUIRED)
message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")

include_directories(${LLVM_INCLUDE_DIRS})
link_directories(${LLVM_LIBRARY_DIRS})

#separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS})
#add_definitions(${LLVM_DEFINITIONS_LIST})

llvm_map_components_to_libnames(llvm_libs support core irreader)

add_executable(Demo main.cpp)

target_link_libraries(Demo ${llvm_libs})

代码是:

#include <iostream>
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Verifier.h"

using namespace llvm;
static llvm::LLVMContext context;

int main() {
    static IRBuilder<> Builder(context);
    Module *module = new Module("Module",context);

    module->dump(); //?? why this not working??
    //This works well: module->print(llvm::errs(), nullptr);
    return 0;
}

如果您知道问题是什么,请帮助我。而且我无法像

module->dump();
那样去实现LLVM函数,我只能看到定义。这是为什么?我上网查了下,可能是llvm处于release模式?

c++ llvm llvm-ir llvm-c++-api
1个回答
0
投票

Module::dump

定义由以下测试来保证:

#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)

Brew 很可能为您提供了一个发布版本,并且 Brew 配方 似乎不包括

LLVM_ENABLE_DUMP

我建议您修补 LLVM 的本地 Brew 配方以包含 LLVM(只需将其添加到从第 100 行开始的列表中),之后您可以通过执行

brew install -s llvm@17
让 Brew 重建 LLVM。

© www.soinside.com 2019 - 2024. All rights reserved.