我正在玩LLVM,我在尝试使用JIT时遇到了问题。我能够构建一个编译器,它可以编译,链接并且运行正常(它编译我的玩具程序)。但是,当我尝试使用构建JIT时,它会失败。
dyld: Symbol not found: __ZN4llvm11RuntimeDyld13MemoryManager6anchorEv
Referenced from: /Users/gruszczy/Projects/shwifty/./bazel-bin/_solib_darwin//liblibjit.so
Expected in: flat namespace
in /Users/gruszczy/Projects/shwifty/./bazel-bin/_solib_darwin//liblibjit.so
Abort trap: 6
我使用Bazel构建所有内容,这些是我的构建规则:
new_local_repository(
name = "llvm",
path = "/opt/local/libexec/llvm-4.0",
build_file= "llvm.BUILD")
cc_library(
name = "main",
srcs = glob(["lib/*.a"]),
hdrs = glob(["include/**/*.*"]),
visibility = ["//visibility:public"],
copts = ["-Iexternal/llvm/include"],
)
我在测试中使用JIT(我在测试中生成IR然后jit它,然后运行方法以查看它是否有效)。
cc_library(
name = "jit",
srcs = ["jit.cc"],
hdrs = ["jit.h"],
deps = [
":ast",
":common",
"@llvm//:main"
],
copts = GENERAL_COPTS)
cc_test(
name = "codegen_test",
srcs = ["codegen_test.cc"],
deps = [
":ast",
":jit",
":lexer",
":parser",
":codegen",
"@gtest//:main",
"@llvm//:main"
],
copts = TEST_COPTS,
data = [":examples"],
size = "small"
)
我可能遗失的任何建议?
答案 0 :(得分:2)
混淆的原因是Bazel默认情况下会静态链接二进制文件,但会动态测试。这使得测试代码重构循环更快,因为对测试代码的更改只会触发测试的重建,而不是整个应用程序。可以通过在linkstatic = 1
目标上设置codegen_test
来停用它。
为什么codegen_test
中的符号在构建为共享库时不存在,这是一个更难的问题,需要更多项目特定的信息。但可能的解决方案可能是将VMRuntimeDyld.a
和VMMCJit.a
生成的目标标记为alwayslink = 1
。