2015-07-20 152 views
1

我有两个静态库文件(.a)和一个使用opt pass创建的bitecode文件(.bc)。在这个咬文件中我添加了我的自己的代码,并在此代码中,我需要调用静态库中声明的函数。我已经注意到,LLVM-LD工具不再存在铛新的版本,所以我尝试了两种不同的方法这三个文件链接(两个图书馆和一个bitecode文件):当在llvm中链接* .a和* .o文件时出现错误

尝试用gcc链接:

与LLC创建file.bc的目标文件

$llc -filetype=obj file.bc -o file.o 

链接对象和库与海湾合作委员会

$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

$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

'$ gcc的-I了lib1.a lib2.a -O3 file.o -o文件'应该改为'$ gcc -llib1.a -llib2.a -O3 file.o -o file'。 gcc的'-I'参数是指定额外的包含路径。 –

+0

当我尝试你的图书馆的建议格式时,这给我: '/ usr/bin/ld:找不到-llibtpc.a /usr/bin/ld:找不到-llibregions。一个 collect2:错误:LD返回1退出status' – adespotos

+0

哎呀,我没有在第一评论:)删除库的前缀和后缀('.a','.so'末和'lib'各图书馆的开始)。确保它们可用并放置在正确的目录(通常为'/ usr/lib /') –

回答

1

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

ld找不到function_in_lib是因为它连接file.o库后,因此不会有机会填补引用file.o要求的原因。如果你正在寻找关于链接的更多细节以及为什么你遇到这个问题,this是一个相当不错的介绍。

如果你只是想解决您的问题,库文件移动到您的命令file.o后,即

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

正如我写在我的问题,我试图改变参数的格式,这给我更多错误的未定义的参考是关于来自图书馆的电话。 (这些库不是我的,我只能用它来进行我的项目) – adespotos

+0

UPDATE:你是对的@Matt,我的失败是参数的顺序,当我编译库时缺少标志(关于numa和线程,但是这个对于这种特殊情况是我的错)你的回答对于这个问题绝对有用。感谢您的回答.. – adespotos