我有两个静态库文件(.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'
我试图改变参数的顺序但是当我这样做时我有更多的错误。我认为错误来自链接,任何想法?
答案 0 :(得分:1)
您获得未定义引用的原因是因为您以错误的方式链接库。链接器以增量顺序工作 - 它查看您提供的第一个文件,并收集文件引用但无法找到的事物列表。然后链接器移动到下一个库并执行相同的操作,但也寻找机会来修复以前库中未定义的引用。
ld
找不到function_in_lib
的原因是因为它在库之后链接file.o
,因此没有机会填写file.o
的引用}要求。如果您正在寻找有关链接的更多细节以及遇到此问题的原因,this是一个非常好的介绍。
如果您只想解决问题,请将库文件移至命令file.o
之后,即
ld -o linked file.o lib1.a lib2.a -lc