我正在尝试使用 LLVM 作为后端来编写我的第一个 C 编译器,但是当我尝试运行它时出现错误。我在其他地方没有找到任何有关此确切错误消息的信息。 这是错误消息:
./build/cave: error while loading shared libraries: libLLVMWindowsManifest.so.19: cannot open shared object file: No such file or directory
最新的 LLVM 是从源代码安装的,我运行了
make
,也运行了 make install
。
操作系统:WSL Debian 12
生成文件:
CC := clang
PROJECT := cave
CFLAGS := -Wall -Wextra -Werror -Wpedantic
# LLVM stuff
CFLAGS += `llvm-config --cflags`
LDFLAGS := `llvm-config --ldflags`
LIBS := `llvm-config --libs`
INCLUDES := -Iinclude
SRC_DIR := src
SRC := $(wildcard $(SRC_DIR)/*.c)
BUILD_DIR := build
OBJ := $(SRC:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.o)
.PHONY: all build clean
all: build
build: $(BUILD_DIR)/$(PROJECT)
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
@mkdir -p $(@D)
$(CC) $(CFLAGS) -c $< -o $@ $(INCLUDES) $(BUILD_ARGS)
$(BUILD_DIR)/$(PROJECT): $(OBJ)
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS) $(LIBS) $(BUILD_ARGS)
release:
$(MAKE) BUILD_ARGS="-O3" -B
clean:
rm -rf $(BUILD_DIR)
codegen.h:
#pragma once
#include <llvm-c/Types.h>
typedef struct LLVMBackend {
LLVMContextRef context;
LLVMModuleRef module;
LLVMBuilderRef builder;
LLVMValueRef *(*generateLLVMIR)(struct LLVMBackend *);
} LLVMBackend;
LLVMBackend backend_new(void);
void free_backend(LLVMBackend);
这也是 codegen.c 文件:
#include "codegen.h"
#include <llvm-c/Core.h>
#include <stddef.h>
static LLVMValueRef *generateLLVMIR(LLVMBackend *self) {
(void)self; // not used yet
return NULL;
}
LLVMBackend backend_new(void) {
LLVMContextRef context = LLVMContextCreate();
LLVMModuleRef module =
LLVMModuleCreateWithNameInContext("example", context);
LLVMBuilderRef builder = LLVMCreateBuilderInContext(context);
return (LLVMBackend){
.context = context,
.module = module,
.builder = builder,
.generateLLVMIR = generateLLVMIR,
};
}
void free_backend(LLVMBackend backend) {
LLVMDisposeBuilder(backend.builder);
LLVMDisposeModule(backend.module);
LLVMContextDispose(backend.context);
}
我尝试使用
make clean
重新安装 LLVM 二进制文件,然后再次使用 make
和 make install
,但没有成功。
您需要指定可执行文件在运行时可以找到 LLVM 库的路径:
export LD_LIBRARY_PATH=$(llvm-config --libdir):$LD_LIBRARY_PATH
./build/cave