Clang-3.8未定义对“main';使用全局变量从llvm字节码编译对象文件时 我试图通过C++ API在LLVM中实现嵌套函数。在执行语义检查(以确保将要编译的程序具有正确的嵌套引用等)之后,我在llvm中定义同一范围内的所有函数,并将所有变量设置为全局变量。我本以为这会奏效,但我发现自己在使用以下命令从.o文件获取可执行文件时遇到了巨大的问题: "llvm-as-3.8 output.ll| llc-3.8 -filetype=obj | clang-3.8 ../library/library.a -v -o out"

Clang-3.8未定义对“main';使用全局变量从llvm字节码编译对象文件时 我试图通过C++ API在LLVM中实现嵌套函数。在执行语义检查(以确保将要编译的程序具有正确的嵌套引用等)之后,我在llvm中定义同一范围内的所有函数,并将所有变量设置为全局变量。我本以为这会奏效,但我发现自己在使用以下命令从.o文件获取可执行文件时遇到了巨大的问题: "llvm-as-3.8 output.ll| llc-3.8 -filetype=obj | clang-3.8 ../library/library.a -v -o out",clang,llvm,llvm-clang,llvm-ir,llvm-c++-api,Clang,Llvm,Llvm Clang,Llvm Ir,Llvm C++ Api,通过对全局变量使用llvm::GlobalValue::WeakAnyLinkage或llvm::GlobalValue::ExternalLinkage链接,我得到: /usr/bin/ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重新定位0具有无效的符号索引11 /usr/bin/ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重新定位

通过对全局变量使用
llvm::GlobalValue::WeakAnyLinkage
llvm::GlobalValue::ExternalLinkage
链接,我得到:

/usr/bin/ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重新定位0具有无效的符号索引11

/usr/bin/ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重新定位1具有无效的符号索引12

/usr/bin/ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重新定位8具有无效的符号索引12

/usr/bin/ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_行):重新定位0具有无效的符号索引2

/usr/bin/./lib/gcc/x86_64-linux-gnu/4.8/./../../../../x86_64-linux-gnu/crt1.o:在函数“u start”中:

(.text+0x20):对“main”的未定义引用

这似乎与main的定义有关,在我的ir代码定义中,main代表:

;函数属性:表
定义void@main()#0{

问题是,当我没有使用全局变量时,同一个命令没有任何问题,当然除了在子函数中使用变量的情况,这就是我尝试将alloca更改为全局变量的原因

帮助找到这个问题的解决方案。 提前谢谢。 注1:我使用llvm-3.8

更新: 当我从clang命令中删除-v时,结果是:

优化的_输出.o:在函数
bsort'中:
细化的_output.ll:(.text+0x4):未定义对
x'的引用 细化的_output.ll:(.text+0xa):对
n'的未定义引用
优化的_output.ll:(.text+0x10):未定义对
changed'的引用 细化的_output.ll:(.text+0x22):未定义对
i'
优化的_output.ll:(.text+0x2c):未定义对
的引用已更改' 细化的_output.ll:(.text+0x42):未定义对
i'
细化的_output.ll:(.text+0x48):未定义对
n'的引用 细化的_output.ll:(.text+0x50):未定义对
i'
细化的_output.ll:(.text+0x59):未定义对
x'的引用 细化的_output.ll:(.text+0x60):未定义对
i'
细化的_output.ll:(.text+0x75):未定义对
x'的引用 细化的_output.ll:(.text+0x7c):未定义对
i'
细化的_output.ll:(.text+0x95):未定义对
changed'的引用 细化的_output.ll:(.text+0xa3):未定义对
的引用已更改'
优化的_输出.o:在函数中
swap': 细化的_output.ll:(.text+0xc3):未定义对
x.1'的引用
细化的_output.ll:(.text+0xca):未定义对
y'的引用 细化的_output.ll:(.text+0xd1):未定义对
x.1'的引用
细化的_output.ll:(.text+0xd9):未定义对
t' 细化的_output.ll:(.text+0xe0):未定义对
x.1'的引用
细化的_output.ll:(.text+0xe7):未定义对
y'的引用 细化的_output.ll:(.text+0xf2):未定义对
y'的引用
细化的_output.ll:(.text+0xf8):未定义对
t' 优化的_输出.o:在函数
main'中:
细化的_output.ll:(.text+0x102):未定义对
i.4'的引用 细化的_output.ll:(.text+0x10c):未定义对
seed'的引用
细化的_output.ll:(.text+0x123):未定义对
x.2'的引用 细化的_output.ll:(.text+0x12a):未定义对
i.4'的引用
优化的_output.ll:(.text+0x130):未定义对
seed'的引用 优化的_output.ll:(.text+0x15d):对
seed'的未定义引用
细化的_output.ll:(.text+0x166):未定义对
i.4'的引用 细化的_output.ll:(.text+0x16c):未定义对
i.4'的引用
细化的_output.ll:(.text+0x177):未定义对
x.2'的引用 细化的_output.ll:(.text+0x18d):未定义对
x.2'的引用
细化的_output.ll:(.text+0x19e):未定义对
x.2'的引用 优化的_output.o:在函数
printArray'中:
细化的_output.ll:(.text+0x1c4):未定义对
msg'的引用 细化的_output.ll:(.text+0x1cb):未定义对
x.2'的引用
细化的_output.ll:(.text+0x1d1):未定义对
n.3'的引用 细化的_output.ll:(.text+0x1d8):未定义对
msg'的引用
细化的_output.ll:(.text+0x1e3):未定义对
i.4'的引用 细化的_output.ll:(.text+0x1f3):未定义对
x.2'的引用
细化的_output.ll:(.text+0x1fa):未定义对
i.4'的引用 细化的_output.ll:(.text+0x208):未定义对
i.4'的引用
细化的_output.ll:(.text+0x20e):未定义对
i.4'的引用 细化的_output.ll:(.text+0x214):未定义对
n.3'的引用
细化的_output.ll:(.text+0x21c):未定义对
i.4'的引用

叮当声:错误:链接器命令失败,退出代码为1(使用-v查看调用)

在llvm IR中,所有这些变量在我的程序开始时定义为:

@x = external global i32*
@n = external global i32
@i = external global i32
@changed = external global i1
@x.1 = external global i32*
@y = external global i32*
@t = external global i32
@msg = external global i8*
@x.2 = external global i32*
@n.3 = external global i32
@i.4 = external global i32
@const_string_temp = private constant [3 x i8] c", \00", align 1
@const_string_temp.5 = private constant [2 x i8] c"\0A\00", align 1
@i.6 = external global i32
@x.7 = external global i32
@seed = external global i32
@const_string_temp.8 = private constant [16 x i8] c"Initial array: \00", align 1
@const_string_temp.9 = private constant [15 x i8] c"Sorted array: \00", align 1
我希望这能帮助你帮助我,否则我会在生成红外代码时发现问题

我很期待

@x = external global i32*
等等都是全局变量声明,而不是定义。因此,“undefined reference”错误是有效的,您确实需要定义它们

有关更多信息,请参阅

还要注意的是,llvm as/llc部分是冗余的——clang可以很好地编译.ll/.bc文件

等等都是全局变量声明,而不是定义。因此,“undefined reference”错误是有效的,您确实需要定义它们

有关更多信息,请参阅

还要注意的是,llvm as/llc部分是冗余的-clang可能是c