使用 LLVM 和 C++ 构建共享库时出现链接器错误

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

我正在开发一个项目,尝试使用 C++ 和 LLVM 构建共享库。目标是从编程语言的抽象语法树 (AST) 表示生成 LLVM IR。但是,我在构建过程中遇到链接器错误。我认为这些错误与 LLVM 库有关,但我无法解决它们。这是我用来构建共享库的命令

g++ -shared -o libNodeBridge.dylib Compiler/bridge/bridge/JavaBridge.cpp Compiler/bridge/token/Token.cpp Compiler/bridge/parser/ParseTokenToAst.cpp Compiler/llvm_codegen/LLVMCodeGen.cpp \
$(/Users/kagelol/_development/Compiler/bin/llvm-config --cxxflags) -frtti \
-I/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home/include/darwin

当我尝试构建共享库时,出现以下链接器错误:

ld: Undefined symbols:
  llvm::LLVMContext::LLVMContext(), referenced from:
      LLVMCodeGen::LLVMCodeGen() in LLVMCodeGen-76e962.o
  llvm::LLVMContext::~LLVMContext(), referenced from:
      LLVMCodeGen::~LLVMCodeGen() in JavaBridge-773828.o
  ...

我正在使用 Xcode,并在开发环境中包含了必要的标头和库路径。我怀疑这个问题可能与我链接 LLVM 库的方式有关,但我不确定到底是什么导致了问题。

-什么可能导致与 llvm::LLVMContext、llvm::LLVMContext::~LLVMContext() 和其他相关符号相关的链接器错误? - 使用 LLVM 构建共享库时是否需要包含任何其他链接器标志或库? - 在配置 Xcode 以正确链接 LLVM 库时,我是否可能缺少一个步骤?

xcode shared-libraries llvm llvm-ir
1个回答
0
投票

提供库的路径是不够的,这只是链接器用来查找您的库的路径(如果您正在链接该库而当前没有)。在您的情况下,您需要链接到

core
库。

解决此问题的最佳方法是使用

llvm-config

例如,如果您调用:

llvm-config --libs core
它会给你这样的东西:
-lLLVM-16
,所以如果你把它添加到你的
g++
命令中,它就会起作用。

要使其适用于未来的

llvm
版本,只需更新使用
llvm-config
的命令部分:

g++ -shared -o libNodeBridge.dylib Compiler/bridge/bridge/JavaBridge.cpp Compiler/bridge/token/Token.cpp Compiler/bridge/parser/ParseTokenToAst.cpp Compiler/llvm_codegen/LLVMCodeGen.cpp \
$(/Users/kagelol/_development/Compiler/bin/llvm-config --cppflags --ldflags --libs core) -frtti ...

注意这部分:

llvm-config --cppflags --ldflags --libs core

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