问题描述
我正在尝试用 C++ 编译我自己的 ANTLR4 解析器
#include "nibble.h"
using namespace antlr4;
using namespace nibble;
int main(int argc,const char* argv[]){
const std::string file_name = argv[1];
ANTLRInputStream input(file_name);
return 0;
}
但是当我通过输入 g++ nibblec.cpp -o nibblec -I /usr/local/include/antlr4-runtime
编译它时我得到
/usr/bin/ld: /tmp/ccqG8KT4.o: warning: relocation against '_ZTVN6antlr416ANTLRInputStreamE' in read-only section '.text._ZN6antlr416ANTLRInputStreamD2Ev[_ZN6antlr416ANTLRInputStreamD5Ev]'
/usr/bin/ld: /tmp/ccqG8KT4.o: in function 'main':
nibblec.cpp:(.text+0x64): undefined reference to 'antlr4::ANTLRInputStream::ANTLRInputStream(std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char> > const&)'
/usr/bin/ld: /tmp/ccqG8KT4.o: in function 'antlr4::ANTLRInputStream::~ANTLRInputStream()':
nibblec.cpp:(.text._ZN6antlr416ANTLRInputStreamD2Ev[_ZN6antlr416ANTLRInputStreamD5Ev]+0xf): undefined reference to `vtable for antlr4::ANTLRInputStream'
/usr/bin/ld: nibblec.cpp:(.text._ZN6antlr416ANTLRInputStreamD2Ev[_ZN6antlr416ANTLRInputStreamD5Ev]+0x42): undefined reference to 'antlr4::CharStream::~CharStream()'
/usr/bin/ld: warning: creating DT_TEXTREL in a PIE
collect2: error: ld returned 1 exit status
什么是ld?为什么我会收到所有这些警告?我在使用 ANTLR4 时做错了什么吗?
编辑:我使用的是 ANTLR 4.9.1
解决方法
您没有链接到 ANTLR。您可能需要将 -lantlr
添加到您的编译标志(尽管确切的拼写可能不同,您可能需要指定一个包含 ANTLR 的库目录)。