我正在开发一个LLVM编译器传递.我按以下方式运行传递:
编译为LLVM bitcode
clang foo.c -emit-llvm -c -o foo.bc
Run Code Online (Sandbox Code Playgroud)通过opt运行foo.bc(没有此步骤仍会发生错误)
编译回目标文件
clang -c -o foo.o foo.bc
Run Code Online (Sandbox Code Playgroud)现在foo.o可能是静态库的一部分.
ar rc libfoo.a foo.o
Run Code Online (Sandbox Code Playgroud)当以这种方式编译所有我的c文件时,我无法链接到libfoo.a.
clang libfoo.a linkme.o -o linkme
linkme.o:linkme.bc:function main: error: undefined reference to 'foo'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)源文件:
foo.c的:
int foo(int a)
{
return a;
}
Run Code Online (Sandbox Code Playgroud)
foo.h中
int foo(int a);
Run Code Online (Sandbox Code Playgroud)
linkme.c
#include "foo.h"
int main(int argc, char *argv[])
{
foo(6);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在我觉得很傻.它与.bc文件无关,只与参数的顺序有关.
作品:
clang linkme.o libfoo.a -o linkme
Run Code Online (Sandbox Code Playgroud)
失败:
clang libfoo.a linkme.o -o linkme
Run Code Online (Sandbox Code Playgroud)