Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

C runtime LLVM error: error while loading shared libraries

I am trying to write my first ever compiler in C using LLVM for its backend, but I get an error when I try to run it. I have not found anything about this exact error message on other places.
Here is the error message:

./build/cave: error while loading shared libraries: libLLVMWindowsManifest.so.19: cannot open shared object file: No such file or directory

The latest LLVM is installed from source, I ran make, and make install too.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

OS: WSL Debian 12

Makefile:

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);

Here is the codegen.c file too:

#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);
}

I tried reinstalling the LLVM binaries with make clean and then make and make install again, but it didn’t work.

>Solution :

You need to specify path where your executable can find LLVM libs at runtime:

export LD_LIBRARY_PATH=$(llvm-config --libdir):$LD_LIBRARY_PATH
./build/cave
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading