antlr:master
← felixn:cxx-17
opened 05:05PM - 08 Feb 21 UTC
Currently, the C++ runtime compilation is forced to used the C++11 standard, sin…ce CMAKE_CXX_STANDARD 11 is set in runtime/Cpp/CMakeLists.txt.
When linking an executable built with a newer C++ standard (for example, C++17) against the runtime build with C++11, the following linker error occurs:
```
FAILED: src/antlr/demo
: && /usr/bin/clang++-11 -fuse-ld=lld src/antlr/CMakeFiles/demo.dir/src/demo.cpp.o src/antlr/CMakeFiles/demo.dir/antlr4cpp_generated_src/TLexer/TLexer.cpp.o src/antlr/CMakeFiles/demo.dir/antlr4cpp_generated_src/TParser/TParser.cpp.o -o src/antlr/demo src/antlr/antlr4_runtime/src/antlr4_runtime/runtime/Cpp/dist/libantlr4-runtime.a && :
ld.lld: error: undefined symbol: antlr4::ANTLRInputStream::ANTLRInputStream(std::basic_string_view<char, std::char_traits<char> >)
>>> referenced by demo.cpp:20 (../src/antlr/src/demo.cpp:20)
>>> src/antlr/CMakeFiles/demo.dir/src/demo.cpp.o:(main)
```
This occurs due to the following snippet in ANTLRInputStream.h:
```C++
#if __cplusplus >= 201703L
ANTLRInputStream(std::string_view input = "");
#else
ANTLRInputStream(const std::string &input = "");
#endif
```
-> the runtime - built with C++11 - contains a different constructor than an executable - built with C++17 - tries to use
This pull request allows overriding the C++ standard for the runtime build - default is still C++11.
Therefore, projects using the C++ can choose to build the runtime with a newer standard.
@mike-lischke - what do you think?