I'm trying to use SFML as my graphics backbone for a C++ game engine. I'm also using the V8 JavaScript engine. The problem is, to get V8 to compile, I've got to use -stdlib=libstdc++
, and to get SFML to compile, I've got to use -stdlib=libc++
. Obviously, I can't use both, so how can I work around this?
I'm using Xcode on a Mac Mini, by the way, but it doesn't work through the terminal either.
SFML gives me these errors when using -stdlib=libstdc++
:
Undefined symbols for architecture x86_64:
"sf::String::String(char const*, std::locale const&)", referenced from:
And V8 gives me these errors when using -stdlib=libc++
:
Undefined symbols for architecture x86_64:
"std::_Rb_tree_decrement(std::_Rb_tree_node_base*)", referenced from:
std::_Rb_tree<unsigned char*, std::pair<unsigned char* const, v8::internal::AddressToTraceMap::RangeStack>, std::_Select1st<std::pair<unsigned char* const, v8::internal::AddressToTraceMap::RangeStack> >, std::less<unsigned char*>, std::allocator<std::pair<unsigned char* const, v8::internal::AddressToTraceMap::RangeStack> > >::_M_insert_unique(std::pair<unsigned char* const, v8::internal::AddressToTraceMap::RangeStack> const&) in libv8_base.x64.a(allocation-tracker.o)
"std::_Rb_tree_increment(std::_Rb_tree_node_base*)", referenced from:
v8::internal::AddressToTraceMap::RemoveRange(unsigned char*, unsigned char*) in libv8_base.x64.a(allocation-tracker.o)
v8::internal::AddressToTraceMap::Print() in libv8_base.x64.a(allocation-tracker.o)
"std::__throw_length_error(char const*)", referenced from:
std::vector<v8::internal::WorkerThread*, std::allocator<v8::internal::WorkerThread*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<v8::internal::WorkerThread**, std::vector<v8::internal::WorkerThread*, std::allocator<v8::internal::WorkerThread*> > >, v8::internal::WorkerThread* const&) in libv8_base.x64.a(default-platform.o)
"std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)", referenced from:
v8::internal::AddressToTraceMap::RemoveRange(unsigned char*, unsigned char*) in libv8_base.x64.a(allocation-tracker.o)
"std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)", referenced from:
std::_Rb_tree<unsigned char*, std::pair<unsigned char* const, v8::internal::AddressToTraceMap::RangeStack>, std::_Select1st<std::pair<unsigned char* const, v8::internal::AddressToTraceMap::RangeStack> >, std::less<unsigned char*>, std::allocator<std::pair<unsigned char* const, v8::internal::AddressToTraceMap::RangeStack> > >::_M_insert_unique(std::pair<unsigned char* const, v8::internal::AddressToTraceMap::RangeStack> const&) in libv8_base.x64.a(allocation-tracker.o)
You need to recompile SFML and/or V8 with the same std lib since they are not compatible. I don't know for V8 but SFML should be able to work with libstdc++ too (set CMAKE_CXX_FLAGS
and CMAKE_C_FLAGS
to -stdlib=libstdc++
when generating the makefile). You won't be able to use C++11 features with libstdc++, though.