使用 -l 和 -L 标志时静态库未链接?

时间:2021-07-23 11:20:51

标签: c makefile static-libraries

所以,我正在尝试使用一个名为 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)?感谢阅读。

1 个答案:

答案 0 :(得分:0)

您的错误消息说:

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
  • 这为您提供了一些关于正在发生的事情的提示:它说它在目录 libtree-sitter.0.dylib 中没有找到 /usr/local/lib 这表明您没有指定一个 -L 选项来搜索你说的子目录。

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

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

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

相关问题