【问题标题】:Static library not linking when using -l and -L flags?使用 -l 和 -L 标志时静态库未链接?
【发布时间】:2021-07-23 11:20:51
【问题描述】:

所以,我有一个名为libtree-sitter.a 的静态库,我正在尝试使用它。这是来自documentation的编译命令:

clang                                   \
  -I tree-sitter/lib/include            \
  test-json-parser.c                    \
  tree-sitter-json/src/parser.c         \
  tree-sitter/libtree-sitter.a          \
  -o test-json-parser

上述命令编译成功,可执行文件正常工作。我尝试将静态库的加载更改为标志,以便我可以使我的构建系统更通用。我的更改如下:

clang                                   \
  -I tree-sitter/lib/include            \
  test-json-parser.c                    \
  tree-sitter-json/src/parser.c         \
  -o test-json-parser                   \
  -Ltree-sitter -ltree-sitter

这会编译,但运行可执行文件会出现此错误:

dyld: Library not loaded: /usr/local/lib/libtree-sitter.0.dylib
  Referenced from: /Users/jason/Downloads/tree sitter test/test-json-parser
  Reason: image not found

谁能解释一下这两个例子的区别?根据我对-l-L 的理解,它应该仍然可以在同一个地方找到库。什么是标志的等效组合,以便我可以使加载库更通用并且更容易与 Makefile 模板集成(我使用的是this one)?感谢阅读。

【问题讨论】:

  • -L 定义了你的库的位置,-l 是编译后的 src,你可以在这里阅读编译器标志caiorss.github.io/C-Cpp-Notes/compiler-flags-options.html
  • 所以-L-l 只适用于共享库,而不是静态的?否则,我相信我在示例中正确定义了这两个标志。
  • tree-sitter/ 中是否有动态版本的 libtree-sitter?如果是这样,链接器会更喜欢它并且不会使用静态库
  • 叫它libtree-sitter.a-l 选项将 lib 添加到它正在查找的库文件名之前。
  • 但无论如何:如果您想让库静态链接,那么像第一个示例中所做的那样将其显式传递给 clang 有什么不好?

标签: c makefile static-libraries


【解决方案1】:

你的错误信息说:

dyld: Library not loaded: /usr/local/lib/libtree-sitter.0.dylib
  Referenced from: /Users/jason/Downloads/tree sitter test/test-json-parser
  Reason: image not found
  • 这给了你一些关于正在发生的事情的提示:它说它在目录/usr/local/lib 中没有找到libtree-sitter.0.dylib,这表明你没有指定-L 选项来在你说的子目录中搜索。

首先,我建议您使用选项-v 执行clang,以显示它用于调用链接器的命令行。这可能不会显示您指定的 -L 选项及其参数。

我的猜测是,您在某些脚本中使用了该命令行,该脚本正在删除一些 \ 字符(或者您在 \ 之后有一个空格,并且您正在获得一个新行来剪切您的命令行链接器选项。检查一下。

您使用的链接器将在任何系统目录之前检查-L 选项中指定的所有目录,以查找名为libyourLibraryName.number.dylib,如果没有找到,将尝试libyourLibraryName.a,然后它会尝试列表中的下一个目录。如果您使用-v 选项调用编译器,您将获得用于调用链接器的一组选项。拜托,如果你把它包括在你的问题中会很好。

【讨论】:

  • 您好,感谢您的回复。帖子下的 cmets 中的一个用户已经解决了这个问题——原来有一个与静态库同名的动态库,所以链接器更喜欢前者。我必须在没有 -l 标志的情况下显式链接静态库。
猜你喜欢
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 2012-08-26
相关资源
最近更新 更多