4

我正在尝试使用 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 引入了哪些文件会非常有帮助。

4

1 回答 1

1

只要整个项目具有所有静态库(我在我的 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

于 2013-02-13T20:54:05.557 回答