Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 链接llvm上的*.a和*.o文件时出错_C_Gcc_Clang_Llvm - Fatal编程技术网

C 链接llvm上的*.a和*.o文件时出错

C 链接llvm上的*.a和*.o文件时出错,c,gcc,clang,llvm,C,Gcc,Clang,Llvm,我有两个静态库文件(.a)和一个位代码文件(.bc),它们是用opt pass创建的。在这个位代码文件中,我添加了自己的代码,在这个代码中,我需要调用一个在静态库中声明的函数。我注意到llvm ld工具不再适用于更新版本,因此我尝试了两种不同的方法来链接这三个文件(两个库和一个位代码文件): 1.尝试与gcc链接: 使用llc创建file.bc的对象文件 $llc -filetype=obj file.bc -o file.o $llc -filetype=obj file.bc -o fi

我有两个静态库文件(.a)和一个位代码文件(.bc),它们是用opt pass创建的。在这个位代码文件中,我添加了自己的代码,在这个代码中,我需要调用一个在静态库中声明的函数。我注意到llvm ld工具不再适用于更新版本,因此我尝试了两种不同的方法来链接这三个文件(两个库和一个位代码文件):

1.尝试与gcc链接:

使用llc创建file.bc的对象文件

$llc -filetype=obj file.bc -o file.o
 $llc -filetype=obj file.bc -o file.o
使用gcc链接对象和libs

$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
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'
(函数_in_lib是我需要从lib调用的函数,编译器找不到该函数)

2.第二种方法是使用ld命令

使用llc创建file.bc的对象文件

$llc -filetype=obj file.bc -o file.o
 $llc -filetype=obj file.bc -o file.o
使用ld链接对象和libs

$ld-o链接lib1.a lib2.a file.o-lc

这些命令导致以下错误:

file.o: In function `main':
file.bc:(.text+0xc0): undefined reference to `function_in_lib'
collect2: error: ld returned 1 exit status
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'

我试图更改参数的顺序,但我这样做时出现了更多错误。我认为错误来自链接,知道吗?

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

ld
在库中找不到
函数的原因是,它在库之后链接了
file.o
,因此没有机会填写
file.o
所需的引用。如果您想了解有关链接的更多细节以及遇到此问题的原因,这是一个非常好的介绍

如果只是想解决问题,请将库文件移动到命令中的after
file.o
,即

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

$gcc-lib1.a lib2.a-O3文件.o-o文件
应更改为
$gcc-llib1.a-llib2.a-O3文件.o-o文件
。gcc的
-I
参数用于指定其他包含路径。当我尝试库的建议格式时,这会告诉我:
/usr/bin/ld:cannot find-llibtpc.a/usr/bin/ld:cannot find-llibregions.a collect2:error:ld返回了1个退出状态
Oops,我在第一次评论时失败:)删除库后缀和前缀(
.a
.so
在每个库的末尾和
lib
开头)。确保它们可用并放在正确的目录中(通常为
/usr/lib/
)这两个库在
/usr/lib/
中不存在。我没有权限将文件复制到这里,然后通过编译器命令行参数将带有
-L
前缀的库目录传递给链接器来添加库目录:
gcc file.o-o file-L/my/libraries/directory-ltpc-lregions
,正如我在问题i中所写的那样ried更改了参数的格式,这给了我更多关于库调用的未定义引用的错误。(库根本不是我的。我必须将它用于我的项目)更新:你是对的@Matt,我的失败是编译库时参数的顺序和缺少的标志(关于numa和线程,但在这种特殊情况下这是我的错)你的回答对这个问题绝对有用。谢谢你的回答。。