在 llvm 链接 *.a 和 *.o 文件时出错
Error when linking *.a and *.o files at llvm
我有两个静态库文件 (.a) 和一个字节码文件 (.bc),它们是用选项创建的 pass.In 这个字节码文件我已经添加了我自己的代码,我需要在这个代码中调用在静态库中声明的函数。我注意到 llvm-ld 工具不再适用于 clang 较新版本,所以我尝试了两种不同的方法来 link 这三个文件(两个库和一个 bitecode 文件):
1. 尝试使用 gcc link :
用 llc 创建 file.bc
的目标文件
$llc -filetype=obj file.bc -o file.o
link 对象和带有 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
link 带有 ld
的对象和库
$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'
我试图改变参数的顺序,但是当我这样做时我有更多的错误it.I认为错误来自linking,知道吗?
您获得未定义引用的原因是您以错误的方式链接了您的库。链接器以递增顺序工作 - 它查看您提供的第一个文件并收集文件引用但找不到的内容列表。然后链接器移动到下一个库并做同样的事情,但也会寻找机会修复以前库中未定义的引用。
ld
找不到 function_in_lib
的原因是它在库之后链接 file.o
,因此没有机会填写 file.o
要求。如果您正在寻找有关链接的更多细节以及为什么 运行 遇到这个问题,this 是一个很好的介绍。
如果您只想解决问题,请将库文件移动到命令中的 file.o
之后,即
ld -o linked file.o lib1.a lib2.a -lc
我有两个静态库文件 (.a) 和一个字节码文件 (.bc),它们是用选项创建的 pass.In 这个字节码文件我已经添加了我自己的代码,我需要在这个代码中调用在静态库中声明的函数。我注意到 llvm-ld 工具不再适用于 clang 较新版本,所以我尝试了两种不同的方法来 link 这三个文件(两个库和一个 bitecode 文件):
1. 尝试使用 gcc link :
用 llc 创建 file.bc
的目标文件$llc -filetype=obj file.bc -o file.o
link 对象和带有 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
link 带有 ld
的对象和库$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'
我试图改变参数的顺序,但是当我这样做时我有更多的错误it.I认为错误来自linking,知道吗?
您获得未定义引用的原因是您以错误的方式链接了您的库。链接器以递增顺序工作 - 它查看您提供的第一个文件并收集文件引用但找不到的内容列表。然后链接器移动到下一个库并做同样的事情,但也会寻找机会修复以前库中未定义的引用。
ld
找不到 function_in_lib
的原因是它在库之后链接 file.o
,因此没有机会填写 file.o
要求。如果您正在寻找有关链接的更多细节以及为什么 运行 遇到这个问题,this 是一个很好的介绍。
如果您只想解决问题,请将库文件移动到命令中的 file.o
之后,即
ld -o linked file.o lib1.a lib2.a -lc