如何编译树守护者解析器?

问题描述 投票:0回答:3

我正在尝试编译 typescript、tsx 和 python 解析器以与 neovim 一起使用,但是当我按照

tree-sitter 跟踪问题的指示运行 
gcc -o parser.so -shared src/parser.c -Os -I./src 时,我得到:

Undefined symbols for architecture x86_64: "_tree_sitter_tsx_external_scanner_create", referenced from: _tree_sitter_tsx.language in parser-eb4e9b.o "_tree_sitter_tsx_external_scanner_deserialize", referenced from: _tree_sitter_tsx.language in parser-eb4e9b.o "_tree_sitter_tsx_external_scanner_destroy", referenced from: _tree_sitter_tsx.language in parser-eb4e9b.o "_tree_sitter_tsx_external_scanner_scan", referenced from: _tree_sitter_tsx.language in parser-eb4e9b.o "_tree_sitter_tsx_external_scanner_serialize", referenced from: _tree_sitter_tsx.language in parser-eb4e9b.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

我已经运行了 npm 构建步骤,并尝试了构建中的 make 文件,但我无法获得最终的

.so

 文件。 

gcc neovim tsx treesitter
3个回答
2
投票
某些语法有

外部扫描器 - 手写的 C/C++ 源文件,按照惯例称为 scanner.c

scanner.cc
,需要与 
parser.c
 一起编译。


2
投票
当解析器名称和函数名称不匹配时,也会出现错误

undefined symbol: tree_sitter_parsername_external_scanner_create


// grammar.js name: 'parsername',
// scanner.cc
void *tree_sitter_oldparsername_external_scanner_create() {
  return new Scanner();
}
快速修复:替换扫描仪源中的名称

sed -i -E 's|(tree_sitter)_oldparsername_|\1_parsername_|g' src/scanner.*
    

0
投票
nvim-treesitter 使用的是

this,对于 c++ 来说有点不同。

gcc -shared -o parser.so -I./src src/parser.c src/scanner.c -Os
如果您有旧版本的 GCC,您可以尝试添加 

--std=c99

-fPIC
。 el7 附带 
gcc
 4.8.5,这对我来说适用于多个解析器。

gcc --std=c99 -shared -o parser.so -I./src src/parser.c src/scanner.c -Os -fPIC
偏离主题,但相关:如果您想将 nvim-treesitter 与较旧的编译器一起使用,请参阅 

修改为与 gcc 4.8 for el7 #5847 一起使用

© www.soinside.com 2019 - 2024. All rights reserved.