I have a very simple, quite standard piece of C++, which I can compile fine using g++1, but which Apple clang++2 is unable to compile:
#include <fstream>
int main() {
std::ifstream file("test.cpp");
return 0;
}
$ clang++ -o test test.cpp
Undefined symbols for architecture x86_64:
"std::__1::basic_filebuf<char, std::__1::char_traits<char> >::open(char const*, unsigned int)", referenced from:
std::__1::basic_ifstream<char, std::__1::char_traits<char> >::basic_ifstream(char const*, unsigned int) in test-2f8096.o
"std::__1::basic_filebuf<char, std::__1::char_traits<char> >::basic_filebuf()", referenced from:
std::__1::basic_ifstream<char, std::__1::char_traits<char> >::basic_ifstream(char const*, unsigned int) in test-2f8096.o
"std::__1::basic_filebuf<char, std::__1::char_traits<char> >::~basic_filebuf()", referenced from:
std::__1::basic_ifstream<char, std::__1::char_traits<char> >::basic_ifstream(char const*, unsigned int) in test-2f8096.o
std::__1::basic_ifstream<char, std::__1::char_traits<char> >::~basic_ifstream() in test-2f8096.o
"VTT for std::__1::basic_ifstream<char, std::__1::char_traits<char> >", referenced from:
std::__1::basic_ifstream<char, std::__1::char_traits<char> >::basic_ifstream(char const*, unsigned int) in test-2f8096.o
std::__1::basic_ifstream<char, std::__1::char_traits<char> >::~basic_ifstream() in test-2f8096.o
"vtable for std::__1::basic_ifstream<char, std::__1::char_traits<char> >", referenced from:
std::__1::basic_ifstream<char, std::__1::char_traits<char> >::basic_ifstream(char const*, unsigned int) in test-2f8096.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
I can't see why Apple clang++ would have difficulty with this piece of code as it uses nothing outside the standard library.
1: g++ version: Homebrew GCC 11.2.0_3
2: clang++ version: Apple clang version 13.1.6
EDIT: This has been resolved by factory resetting the computer this was on (for other reasons). It was probably a configuration error.