在C代码中静态链接libclang

时间:2013-02-09 08:11:24

标签: c libclang

我正在尝试使用libclang中提供的前端为C代码编写一个简单的语法检查程序。由于部署问题,我需要能够静态链接libclang中的所有库,而不是传递包含所有库的.so文件。

我正在从源代码构建clang / llvm,在llvm / Release + Asserts / lib中我有一堆.a文件,我认为我应该可以使用它,但它似乎永远不会工作(链接器喷出关于丢失符号的数千个错误)。但是,当我使用libclang.so编译它时,该目录中也存在如下:

clang main.c -o bin/dlc -I../llvm/tools/clang/include -L../llvm/Release+Asserts/lib/ -lclang

一切似乎都运作良好。

为了使这项工作,我需要包含的最小.a文件集是什么?我已经尝试将所有.a文件包含在构建输出目录中,并以不同的顺序提供给clang / gcc,但没有任何成功。我只需要libclang的Index.h中提到的函数,但似乎没有关于各种libclang * .a文件的资源或文档。了解libclang.so引入的文件将非常有用。

1 个答案:

答案 0 :(得分:0)

以下应该可以工作,只要整个项目都有所有静态库(我在我的Release / lib目录中计算了116)。

clang main.c -o bin / dlc -I ../ llvm / tools / clang / include ../ llvm / Release / lib / *。a

[编辑:clang main.c -o bin / dlc -I ../ llvm / tools / clang / include ../llvm/Release/lib/libclang.a ../llvm/Release/lib/*。 A]

请注意,输出二进制文件不是静态的,因此如果您使用此语法,则不需要gcc或ld的任何-static标志。

如果这不起作用,您可能需要按顺序列出库:如果某个库需要另一个库中可用的函数,则可能需要先在命令行中列出它。请参阅有关链接顺序的评论: http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Link-Options.html#Link-Options