I compiled Embree using my standard compiler gcc 4.7 (I'm holding out on clang for openmp support), but for a specific project I need to use clang. When I try to link against libembree.a
and libsys.a
I get this sort of error:
"std::string::find(char, unsigned long) const", referenced from:
embree::AccelRegistry::create(std::string, embree::RTCGeometry*) in libembree.a(registry_accel.o)
embree::BuilderRegistry::build(std::string, embree::TaskScheduler::Event*, embree::Accel*) in libembree.a(registry_builder.o)
embree::IntersectorRegistry<embree::Intersector1>::get(std::string, std::string, embree::Accel*) in libembree.a(registry_intersector.o)
embree::IntersectorRegistry<embree::Intersector4>::get(std::string, std::string, embree::Accel*) in libembree.a(registry_intersector.o)
"std::string::compare(char const*) const", referenced from:
embree::AccelRegistry::create(std::string, embree::RTCGeometry*) in libembree.a(registry_accel.o)
embree::BuilderRegistry::build(std::string, embree::TaskScheduler::Event*, embree::Accel*) in libembree.a(registry_builder.o)
embree::IntersectorRegistry<embree::Intersector1>::get(std::string, std::string, embree::Accel*) in libembree.a(registry_intersector.o)
embree::IntersectorRegistry<embree::Intersector4>::get(std::string, std::string, embree::Accel*) in libembree.a(registry_intersector.o)
...
I tried using the flag -stdlib=libc++
but this doesn't fix the problem. Using -stdlib=libstdc++
most errors go away except for:
"std::ctype<char>::_M_widen_init() const", referenced from:
embree::rtcBuildAccel(embree::RTCGeometry*, char const*) in libembree.a(embree.o)
embree::BVHStatisticsT<embree::BVH2>::print() in libembree.a(bvh2.o)
embree::BVHStatisticsT<embree::BVH4>::print() in libembree.a(bvh4.o)
embree::BVHBuilderT<embree::BVH4, embree::HeuristicBinning<0> >::createLeafNode(unsigned long, embree::atomic_set<embree::PrimRefBlock>&, embree::HeuristicBinning<0>::PrimInfo const&) in libembree.a(bvh4.o)
embree::BVHBuilderT<embree::BVH4, embree::HeuristicBinning<2> >::createLeafNode(unsigned long, embree::atomic_set<embree::PrimRefBlock>&, embree::HeuristicBinning<2>::PrimInfo const&) in libembree.a(bvh4.o)
embree::BVHBuilderT<embree::BVH4, embree::HeuristicSpatial<0> >::createLeafNode(unsigned long, embree::atomic_set<embree::PrimRefBlock>&, embree::HeuristicSpatial<0>::PrimInfo const&) in libembree.a(bvh4.o)
embree::BVHBuilderT<embree::BVH4, embree::HeuristicSpatial<2> >::createLeafNode(unsigned long, embree::atomic_set<embree::PrimRefBlock>&, embree::HeuristicSpatial<2>::PrimInfo const&) in libembree.a(bvh4.o)
This error seems trickier and to remove it I explicitly link against libgcc_s.a
found in my gcc's libraries: add the linker argument /opt/local/lib/gcc47/libstdc++.a
. This gets me close, but there's a new error:
"___emutls_get_address", referenced from:
___cxa_get_globals_fast in libstdc++.a(eh_globals.o)
___cxa_get_globals in libstdc++.a(eh_globals.o)
Turns out that I need another library from gcc making the arguments now: /opt/local/lib/gcc47/libstdc++.a /opt/local/lib/gcc47/libgcc_s.1.dylib
. And this finally works.
Update: Oddly it seems on the static libstdc++.a
has the final problem. Linking to the dymnamic library libstdc++.dylib
in the same directory works fine (maybe because I'm just avoiding the issue with this example).