【问题标题】:How to get clang to link against a library without the "lib" prefix?如何让clang链接到没有“lib”前缀的库?
【发布时间】:2015-01-29 16:35:09
【问题描述】:

我的情况是我有一个没有“lib”前缀的库。我想链接它,但我无法重新编译它(它实际上是一个 Python 模块)。

现在,如果您在 GCC 或 clang 中使用 '-l' 标志,则会自动添加 lib 前缀并且找不到库。对于 GCC,我可以使用 '-l:mylib.so' 让它链接到任意文件。

但是,这不适用于 clang。是否可以让 clang 链接到没有“lib”前缀的特定库?

【问题讨论】:

  • 只需使用 /full/path/name/to/your/module.lib
  • @n.m.谢谢,这有效!对 GCC 是否同样有效,或者 ':' 是正确的方法吗?
  • 适用于我所知道的所有编译器和链接器。
  • 好的,我认为这不起作用(或者其他一些奇怪的东西)。我尝试使用 GCC 和 clang,并得到一个“没有对应于 -l{mylibrary} 的库文件”,其中 {mylibrary} 是没有 lib 前缀的 .so 文件的完整路径
  • 您可能需要在终端中输入man gcc 并向下滚动到“链接选项”或look at it online

标签: c++ shared-libraries clang dynamic-linking


【解决方案1】:

这回答了这个问题,但角度有所不同。请参阅相关问题C++ 11 code compiles with `clang++`, but not with `clang -x c++`

gcc documention 声明:

链接器根据文件内容将目标文件与库区分开来。

如果您使用clang++ -x c++,这不会起作用。相反,库文件被视为 C++ 源文件,这会产生一百万左右的编译错误。而且你不能把库文件放在-x c++之前,因为需要的符号不会被链接进去。

一个明显的解决方案是将源文件重命名为具有.cpp 扩展名,因此不需要-x 开关(或使用符号链接)。但是,添加到您的构建系统中可能会很痛苦。

与 OP 的问题直接相关的另一个解决方案是通过标志指定库:

    -L. -l:mylib.foo

如果库不在本地目录中,请相应地更改点.

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 2012-05-19
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多