我正在开发一个项目,尝试使用 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 库时,我是否可能缺少一个步骤?
提供库的路径是不够的,这只是链接器用来查找您的库的路径(如果您正在链接该库而当前没有)。在您的情况下,您需要链接到
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