【问题标题】:Statically linking libclang in C code在 C 代码中静态链接 libclang
【发布时间】:2013-01-25 00:32:52
【问题描述】:

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

【问题讨论】:

  • 如果将-static 添加到链接器标志会怎样?
  • 我已经尝试过 gcc -static -lstatic1 -lstatic2 -Wl,-ldynamic1 -ldyanamic2 如link 所见,不静态链接所有libc(我可以动态链接那么多) .但是,它似乎根本没有帮助,因为我仍然需要知道哪些 .a 文件是必要的。
  • 哦,我明白了。链接器抱怨哪些符号?
  • 它抱怨几乎所有可以想象的符号 - 来自编译器各个阶段的许多 C++ 方法。打印所有错误大约需要 30 秒,所以我怀疑如果我在这里复制它会有任何价值......

标签: c libclang


【解决方案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/*.一个]

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

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

【讨论】:

  • 我试过了,但我仍然得到错误。我已经从链接器中粘贴了output,以防我遗漏了一些愚蠢的东西。使用 gcc 或 clang 似乎有同样的问题。这是在 Fedora 17 上。我会尝试猜测链接顺序。
  • 对 `std::string::_Rep::_S_empty_rep_storage' 的未定义引用。缺少标准库函数。运行 clang++ 而不是 clang。
猜你喜欢
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
相关资源
最近更新 更多