2014-09-03 5 views
1

Я пытаюсь создать простую программу, в которую я встрою движок Google V8 Javascript. Инструкции кажутся прямолинейными, но я получаю нечетную ссылку.Ошибка компоновщика при попытке вставить v8

Я нахожусь в Mac OS X 10.9, и я использую Xamarin Studio в качестве моей IDE, которая, как представляется, использует g ++ в качестве компилятора.

Я собрал v8, используя instructions on their site. В частности, в конце концов в make dependencies, я побежал:

make x64.release 

Это оказалось для успешного завершения.

Вот результат я получаю, когда я пытаюсь построить мой проект:

 
g++ -o "/Users/mike/Projects/vate/vate/bin/Debug/vate" "/Users/mike/Projects/vate/vate/bin/Debug/hello_world.o" -v -L"/Users/mike/Projects/v8/xcodebuild/Debug" -l"icudata" -l"icui18n" -l"v8_snapshot" -l"icuuc" -l"v8_libbase" -l"v8_base" -l"v8_libplatform" 
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) 
Target: x86_64-apple-darwin13.3.0 
Thread model: posix 
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.9.0 -o /Users/mike/Projects/vate/vate/bin/Debug/vate -L/Users/mike/Projects/v8/xcodebuild/Debug /Users/mike/Projects/vate/vate/bin/Debug/hello_world.o -licudata -licui18n -lv8_snapshot -licuuc -lv8_libbase -lv8_base -lv8_libplatform -lc++ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/lib/darwin/libclang_rt.osx.a 
Undefined symbols for architecture x86_64: 
    "std::string::c_str() const", referenced from: 
     v8::internal::Logger::SharedLibraryEvent(std::string const&, unsigned long, unsigned long) in libv8_base.a(log.o) 
    "std::allocator::allocator()", referenced from: 
     v8::base::OS::GetSharedLibraryAddresses() in libv8_libbase.a(platform-macos.o) 
    "std::allocator::~allocator()", referenced from: 
     v8::base::OS::GetSharedLibraryAddresses() in libv8_libbase.a(platform-macos.o) 
    "std::basic_string, std::allocator >::basic_string(char const*, std::allocator const&)", referenced from: 
     v8::base::OS::GetSharedLibraryAddresses() in libv8_libbase.a(platform-macos.o) 
    "std::basic_string, std::allocator >::basic_string(std::string const&)", referenced from: 
     v8::base::OS::SharedLibraryAddress::SharedLibraryAddress(v8::base::OS::SharedLibraryAddress const&) in libv8_libbase.a(platform-macos.o) 
     v8::base::OS::SharedLibraryAddress::SharedLibraryAddress(std::string const&, unsigned long, unsigned long) in libv8_libbase.a(platform-macos.o) 
    "std::basic_string, std::allocator >::~basic_string()", referenced from: 
     v8::base::OS::SharedLibraryAddress::~SharedLibraryAddress() in libv8_base.a(log.o) 
     v8::base::OS::GetSharedLibraryAddresses() in libv8_libbase.a(platform-macos.o) 
     v8::base::OS::SharedLibraryAddress::~SharedLibraryAddress() in libv8_libbase.a(platform-macos.o) 
    "std::string::operator=(std::string const&)", referenced from: 
     v8::base::OS::SharedLibraryAddress::operator=(v8::base::OS::SharedLibraryAddress const&) in libv8_libbase.a(platform-macos.o) 
    "std::_Rb_tree_decrement(std::_Rb_tree_node_base*)", referenced from: 
     std::_Rb_tree_iterator >::operator--() in libv8_base.a(allocation-tracker.o) 
     std::_Rb_tree_iterator >::operator--() in libv8_base.a(lithium-codegen.o) 
     std::_Rb_tree_iterator::operator--() in libv8_base.a(verifier.o) 
     std::_Rb_tree_iterator::operator--() in libv8_base.a(instruction.o) 
     std::_Rb_tree_iterator >::operator--() in libv8_base.a(instruction-selector.o) 
     std::_Rb_tree_iterator::operator--() in libv8_base.a(typer.o) 
     std::_Rb_tree_iterator::operator--() in libv8_base.a(graph-visualizer.o) 
     ... 
    "std::_Rb_tree_increment(std::_Rb_tree_node_base const*)", referenced from: 
     std::_Rb_tree_const_iterator >::operator++() in libv8_base.a(lithium.o) 
     std::_Rb_tree_const_iterator::operator++() in libv8_base.a(verifier.o) 
     std::_Rb_tree_const_iterator >::operator++() in libv8_base.a(instruction.o) 
     std::_Rb_tree_const_iterator::operator++() in libv8_base.a(typer.o) 
     std::_Rb_tree_const_iterator::operator++() in libv8_base.a(graph-visualizer.o) 
    "std::_Rb_tree_increment(std::_Rb_tree_node_base*)", referenced from: 
     std::_Rb_tree_iterator >::operator++() in libv8_base.a(allocation-tracker.o) 
     std::_Rb_tree_iterator >::operator++(int) in libv8_base.a(allocation-tracker.o) 
    "std::__throw_length_error(char const*)", referenced from: 
     std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, v8::base::OS::SharedLibraryAddress const&) in libv8_libbase.a(platform-macos.o) 
     std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, v8::internal::compiler::Reducer* const&) in libv8_base.a(pipeline.o) 
     std::vector >::_M_fill_insert(__gnu_cxx::__normal_iterator > >, unsigned long, v8::internal::compiler::Node* const&) in libv8_base.a(ast-graph-builder.o) 
     std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, v8::internal::compiler::Node* const&) in libv8_base.a(ast-graph-builder.o) 
     std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, v8::internal::compiler::FrameStateDescriptor* const&) in libv8_base.a(instruction.o) 
     std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, v8::internal::compiler::Node* const&) in libv8_base.a(simplified-lowering.o) 
     std::vector >::reserve(unsigned long) in libv8_base.a(instruction-selector.o) 
     ... 
    "std::__throw_out_of_range(char const*)", referenced from: 
     std::vector >::_M_range_check(unsigned long) const in libv8_base.a(graph-reducer.o) 
     std::vector >::_M_range_check(unsigned long) const in libv8_base.a(ast-graph-builder.o) 
     std::vector >::_M_range_check(unsigned long) const in libv8_base.a(verifier.o) 
     std::vector >::_M_range_check(unsigned long) const in libv8_base.a(verifier.o) 
     std::vector >::_M_range_check(unsigned long) const in libv8_base.a(graph-replay.o) 
     std::vector >::_M_range_check(unsigned long) const in libv8_base.a(js-context-specialization.o) 
     std::vector >::_M_range_check(unsigned long) const in libv8_base.a(graph-builder.o) 
     ... 
    "std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)", referenced from: 
     std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::erase(std::_Rb_tree_iterator >) in libv8_base.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, std::_Select1st >, std::less, std::allocator > >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::pair const&) in libv8_base.a(allocation-tracker.o) 
     std::_Rb_tree, v8::internal::Handle, std::_Identity >, std::less >, v8::internal::zone_allocator > >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, v8::internal::Handle const&) in libv8_base.a(lithium-codegen.o) 
     std::_Rb_tree, std::less, v8::internal::zone_allocator >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, v8::internal::compiler::Node* const&) in libv8_base.a(verifier.o) 
     std::_Rb_tree, std::less, v8::internal::zone_allocator >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, int const&) in libv8_base.a(instruction.o) 
     std::_Rb_tree, std::_Select1st >, std::less, v8::internal::zone_allocator > >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::pair const&) in libv8_base.a(instruction-selector.o) 
     std::_Rb_tree, std::less, v8::internal::zone_allocator >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, v8::internal::compiler::Node* const&) in libv8_base.a(typer.o) 
     std::_Rb_tree, std::less, v8::internal::zone_allocator >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, v8::internal::compiler::Node* const&) in libv8_base.a(graph-visualizer.o) 
     ... 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

У меня есть ощущение, что я скомпилированный v8 неправильно, или, возможно, для другого компилятора, но я не могу найти способ настроить это. Кто-нибудь еще видел это?

+0

Кажется, программа 'g ++' сообщает вам, что это LLVM на основе и ссылки libclang_rt. Возможно, это может быть путаница, поскольку части std lib отсутствуют. – erenon

+0

Я только что понял (любезно http://stackoverflow.com/questions/19557614/set-up-g-on-os-x), что g ++ на OSX на самом деле не g ++, но на самом деле clang ++. Хм, я не уверен, было бы проще попробовать и получить реальный g ++ здесь, или попытаться заставить его работать с clang ... –

+0

Используйте инструкции на странице, которую вы связали, чтобы скомпилировать с clang - сообщите нам об этом как дела. BTW, clang информирует вас о себе, когда он начинается: 'Apple LLVM version 5.1 (clang-503.0.40) (на основе LLVM 3.4svn)' –

ответ

3

Я понял. У меня было две проблемы:

  1. Я был в замешательстве относительно того, какой компилятор я фактически использовал. На OSX, г ++ фактически слинкован звенеть ++, так что мне нужно собрать V8 используя соглашения звона, а не г ++

  2. Инструкции по компиляции с лязгом на странице Google неверен, за эту ошибку: https://code.google.com/p/v8/issues/detail?id=3072

для справки, компилировать с лязгом, вам нужно настроить среду так:

 
export CXX=`which clang++` 
export CC=`which clang` 
export CPP="`which clang` -E -std=c++11 -stdlib=libc++" 
export LINK="`which clang++` -std=c++11 -stdlib=libc++" 
export CXX_host=`which clang++` 
export CC_host=`which clang` 
export CPP_host="`which clang` -E" 
export LINK_host=`which clang++` 
export GYP_DEFINES="clang=1 mac_deployment_target=10.9" 

вы можете запустить команду make whatever в обычном режиме.

Очевидно, что требуется установить xcode, чтобы существовали clang и clang ++.

Смежные вопросы