在llvm链接* .a和* .o文件时出错

时间:2015-07-20 12:41:32

标签: c gcc clang llvm

我有两个静态库文件(.a)和一个bitecode文件(.bc),它是通过opt pass创建的。在这个bitecode文件中我添加了自己的代码,在这段代码中我需要调用一个函数在静态库中声明。我已经注意到llvm-ld工具不再存在于clang更新的版本,所以我尝试了两种不同的方式来链接这三个文件(两个库和一个bitecode文件):

1。尝试与gcc:

进行关联

使用llc创建file.bc

的目标文件
$llc -filetype=obj file.bc -o file.o

使用gcc链接对象和库

$gcc -I  lib1.a lib2.a -O3 file.o -o file

这些命令给我这个错误:

file.o: In function `main':
file.bc:(.text+0xc0): undefined reference to `function_in_lib'
collect2: error: ld returned 1 exit status

(function_in_lib是我需要从lib调用的函数,编译器找不到这个函数)

2。第二种方式是使用ld命令

使用llc创建file.bc

的目标文件
 $llc -filetype=obj file.bc -o file.o

使用ld链接对象和lib

$ld -o linked lib1.a lib2.a file.o -lc

这些命令给我这个错误:

ld: warning: cannot find entry symbol _start; defaulting to 00000000004002b0
new.o: In function `main':
new.bc:(.text+0xc0): undefined reference to `function_in_lib'

我试图改变参数的顺序但是当我这样做时我有更多的错误。我认为错误来自链接,任何想法?

1 个答案:

答案 0 :(得分:1)

您获得未定义引用的原因是因为您以错误的方式链接库。链接器以增量顺序工作 - 它查看您提供的第一个文件,并收集文件引用但无法找到的事物列表。然后链接器移动到下一个库并执行相同的操作,但也寻找机会来修复以前库中未定义的引用。

ld找不到function_in_lib的原因是因为它在库之后链接file.o,因此没有机会填写file.o的引用}要求。如果您正在寻找有关链接的更多细节以及遇到此问题的原因,this是一个非常好的介绍。

如果您只想解决问题,请将库文件移至命令file.o之后,即

ld -o linked file.o lib1.a lib2.a -lc