我試圖通過C++ API在llvm中實現嵌套函數。在我執行語義檢查後(爲了確保要編譯的程序具有正確的嵌套引用等),我在llvm的同一個作用域中定義了所有函數,並將所有變量設置爲全局變量。我期待這個工作,但我發現有很大的問題,而自己從.o文件將得到一個可執行文件,命令:Clang-3.8在從全局變量編譯來自llvm字節碼的目標文件時對`main'的未定義引用
"llvm-as-3.8 output.ll| llc-3.8 -filetype=obj | clang-3.8 ../library/library.a -v -o out"
通過使用任一llvm::GlobalValue::WeakAnyLinkage
或llvm::GlobalValue::ExternalLinkage
聯動全局變量我得到:
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 12
...
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
這似乎已經與主要的定義,誰在我的紅外代碼的定義來做爲代表:
; Function Attrs: nounwind uwtable define void @main() #0 {
問題是,當我沒有使用全局變量時,同樣的命令沒有任何問題,當然,在子函數中使用變量的情況下,這是我嘗試將alloca更改爲全局的原因。
幫助找到解決此問題的方法。 在此先感謝。 注1:我用LLVM-3.8
UPDATE: 當我從鐺命令的結果是刪除-v:
refined_output.o: In function
bsort': refined_output.ll:(.text+0x4): undefined reference to
x' refined_output.ll:(.text+0xa): undefined reference ton' refined_output.ll:(.text+0x10): undefined reference to
changed' refined_output.ll:(.text+0x22): undefined reference toi' refined_output.ll:(.text+0x2c): undefined reference to
changed' refined_output.ll:(.text+0x42): undefined reference toi' refined_output.ll:(.text+0x48): undefined reference to
n' refined_output.ll:(.text+0x50): undefined reference toi' refined_output.ll:(.text+0x59): undefined reference to
x' refined_output.ll:(.text+0x60): undefined reference toi' refined_output.ll:(.text+0x75): undefined reference to
x' refined_output.ll:(.text+0x7c): undefined reference toi' refined_output.ll:(.text+0x95): undefined reference to
changed' refined_output.ll:(.text+0xa3): undefined reference tochanged' refined_output.o: In function
swap': refined_output.ll:(.text+0xc3): undefined reference tox.1' refined_output.ll:(.text+0xca): undefined reference to
y' refined_output.ll:(.text+0xd1): undefined reference tox.1' refined_output.ll:(.text+0xd9): undefined reference to
t' refined_output.ll:(.text+0xe0): undefined reference tox.1' refined_output.ll:(.text+0xe7): undefined reference to
y' refined_output.ll:(.text+0xf2): undefined reference toy' refined_output.ll:(.text+0xf8): undefined reference to
t' refined_output.o: In functionmain': refined_output.ll:(.text+0x102): undefined reference to
i.4' refined_output.ll:(.text+0x10c): undefined reference toseed' refined_output.ll:(.text+0x123): undefined reference to
x.2' refined_output.ll:(.text+0x12a): undefined reference toi.4' refined_output.ll:(.text+0x130): undefined reference to
seed' refined_output.ll:(.text+0x15d): undefined reference toseed' refined_output.ll:(.text+0x166): undefined reference to
i.4' refined_output.ll:(.text+0x16c): undefined reference toi.4' refined_output.ll:(.text+0x177): undefined reference to
x.2' refined_output.ll:(.text+0x18d): undefined reference tox.2' refined_output.ll:(.text+0x19e): undefined reference to
x.2' refined_output.o: In functionprintArray': refined_output.ll:(.text+0x1c4): undefined reference to
msg' refined_output.ll:(.text+0x1cb): undefined reference tox.2' refined_output.ll:(.text+0x1d1): undefined reference to
n.3' refined_output.ll:(.text+0x1d8): undefined reference tomsg' refined_output.ll:(.text+0x1e3): undefined reference to
i.4' refined_output.ll:(.text+0x1f3): undefined reference tox.2' refined_output.ll:(.text+0x1fa): undefined reference to
i.4' refined_output.ll:(.text+0x208): undefined reference toi.4' refined_output.ll:(.text+0x20e): undefined reference to
i.4' refined_output.ll:(.text+0x214): undefined reference ton.3' refined_output.ll:(.text+0x21c): undefined reference to
i.4'clang: error: linker command failed with exit code 1 (use -v to see invocation)
,所有這個變量在我的計劃中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
我希望這可以幫助你,幫助我---或者在我的紅外代碼生成中發現問題。
我期待着它..
void main?你確定? – kfsone
將其更改爲int main()不會更改任何內容。 –