所以,我正在尝试使用一个名为 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)?感谢阅读。
答案 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
选项中指定的所有目录,以查找名为 lib
yourLibraryName.
< em>number.dylib
,如果没有找到,会尝试lib
yourLibraryName.a
,然后会尝试下一个目录列表。如果您使用 -v
选项调用编译器,您将获得用于调用链接器的选项集。拜托,如果您将其包含在您的问题中就好了。