【发布时间】: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