2012-04-28 3 views
1

나는 아직도 libC++로 힘들어하고 있습니다.libC++ 컴파일 된 부스트와 연결

내가 여기처럼 ++의 libc와 후원을 컴파일 : 다른 하나는 정확한 코드를 완벽하게 정상적으로 컴파일 동안 How to compile/link Boost with clang++/libc++?

지금 난 내 컴퓨터 중 하나에서이 컴파일 오류를보고하고있다. 둘 다 동일한 컴파일러 버전을 사용하며 환경 변수도 동일합니다. 난 아직도 ABI 호환성 문제와 붙어

Linking CXX executable main 
/opt/local/bin/cmake -E cmake_link_script CMakeFiles/main.dir/link.txt --verbose=1 
/usr/bin/clang++ -arch x86_64 -Wl,-search_paths_first -Wl,-headerpad_max_install_names -stdlib=libc++ CMakeFiles/main.dir/main.cpp.o -o main /usr/lib/libpython2.7.dylib /opt/local/lib/libboost_program_options-mt-d.a /opt/local/lib/libboost_filesystem-mt-d.a /opt/local/lib/libboost_system-mt.a /opt/local/lib/libboost_date_time-mt.a /opt/local/lib/libboost_python-mt.a /opt/local/lib/libboost_log-mt.a /opt/local/lib/libboost_thread-mt.a 
Undefined symbols for architecture x86_64: 
    "__ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendIPwEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueERS5_E4typeES9_S9_", referenced from: 
     std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > boost::detail::convert<wchar_t, char, boost::_bi::bind_t<std::__1::codecvt_base::result, boost::_mfi::cmf7<std::__1::codecvt_base::result, std::__1::codecvt<wchar_t, char, __mbstate_t>, __mbstate_t&, char const*, char const*, char const*&, wchar_t*, wchar_t*, wchar_t*&>, boost::_bi::list8<boost::_bi::value<std::__1::codecvt<wchar_t, char, __mbstate_t> const*>, boost::arg<1>, boost::arg<2>, boost::arg<3>, boost::arg<4>, boost::arg<5>, boost::arg<6>, boost::arg<7> > > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, boost::_bi::bind_t<std::__1::codecvt_base::result, boost::_mfi::cmf7<std::__1::codecvt_base::result, std::__1::codecvt<wchar_t, char, __mbstate_t>, __mbstate_t&, char const*, char const*, char const*&, wchar_t*, wchar_t*, wchar_t*&>, boost::_bi::list8<boost::_bi::value<std::__1::codecvt<wchar_t, char, __mbstate_t> const*>, boost::arg<1>, boost::arg<2>, boost::arg<3>, boost::arg<4>, boost::arg<5>, boost::arg<6>, boost::arg<7> > >) in libboost_program_options-mt-d.a(convert.o) 
    "__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueERS5_E4typeES9_S9_", referenced from: 
     std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > boost::detail::convert<char, wchar_t, boost::_bi::bind_t<std::__1::codecvt_base::result, boost::_mfi::cmf7<std::__1::codecvt_base::result, std::__1::codecvt<wchar_t, char, __mbstate_t>, __mbstate_t&, wchar_t const*, wchar_t const*, wchar_t const*&, char*, char*, char*&>, boost::_bi::list8<boost::_bi::value<std::__1::codecvt<wchar_t, char, __mbstate_t> const*>, boost::arg<1>, boost::arg<2>, boost::arg<3>, boost::arg<4>, boost::arg<5>, boost::arg<6>, boost::arg<7> > > >(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&, boost::_bi::bind_t<std::__1::codecvt_base::result, boost::_mfi::cmf7<std::__1::codecvt_base::result, std::__1::codecvt<wchar_t, char, __mbstate_t>, __mbstate_t&, wchar_t const*, wchar_t const*, wchar_t const*&, char*, char*, char*&>, boost::_bi::list8<boost::_bi::value<std::__1::codecvt<wchar_t, char, __mbstate_t> const*>, boost::arg<1>, boost::arg<2>, boost::arg<3>, boost::arg<4>, boost::arg<5>, boost::arg<6>, boost::arg<7> > >) in libboost_program_options-mt-d.a(convert.o) 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make[2]: *** [main] Error 1 
make[1]: *** [CMakeFiles/main.dir/all] Error 2 
make: *** [all] Error 2 

: 여기

오류인가? 여기

코드입니다 :

#include <iostream> 
#include <string> 
#include <tuple> 
#include <mutex> 
#include <boost/filesystem.hpp> 
#include <boost/system/system_error.hpp> 
#include <boost/system/error_code.hpp> 
#include <boost/program_options.hpp> 
#include <CoreFoundation/CoreFoundation.h> 
namespace po = boost::program_options; 
int main(int ac, char* av[]) 
{ 
    using namespace std; 
    std::mutex mymutex; 
    std::tuple<int, int ,char> mytuple; 

    boost::filesystem::path mypath("/usr/local/bin"); 
    boost::filesystem::path agaain("/usr"); 

    try { 

     po::options_description desc("Allowed options"); 
     desc.add_options() 
      ("help", "produce help message") 
      ("compression", po::value<double>(), "set compression level") 
     ; 

     po::variables_map vm;   
     po::store(po::parse_command_line(ac, av, desc), vm); 
     po::notify(vm);  

     if (vm.count("help")) { 
      cout << desc << "\n"; 
      return 0; 
     } 

     if (vm.count("compression")) { 
      cout << "Compression level was set to " 
       << vm["compression"].as<double>() << ".\n"; 
     } else { 
      cout << "Compression level was not set.\n"; 
     } 
    } 
    catch(exception& e) { 
     cerr << "error: " << e.what() << "\n"; 
     return 1; 
    } 
    catch(...) { 
     cerr << "Exception of unknown type!\n"; 
    } 

    return 0; 
} 

코드가 잘 컴파일,하지만 오류 아웃 링크 할 때. 한편

[email protected]:build$ make VERBOSE=1 
/opt/local/bin/cmake -H/Users/chen/Code/clang -B/Users/chen/Code/clang/build --check-build-system CMakeFiles/Makefile.cmake 0 
/opt/local/bin/cmake -E cmake_progress_start /Users/chen/Code/clang/build/CMakeFiles /Users/chen/Code/clang/build/CMakeFiles/progress.marks 
make -f CMakeFiles/Makefile2 all 
make -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/depend 
cd /Users/chen/Code/clang/build && /opt/local/bin/cmake -E cmake_depends "Unix Makefiles" /Users/chen/Code/clang /Users/chen/Code/clang /Users/chen/Code/clang/build /Users/chen/Code/clang/build /Users/chen/Code/clang/build/CMakeFiles/main.dir/DependInfo.cmake --color= 
Dependee "/Users/chen/Code/clang/build/CMakeFiles/main.dir/DependInfo.cmake" is newer than depender "/Users/chen/Code/clang/build/CMakeFiles/main.dir/depend.internal". 
Dependee "/Users/chen/Code/clang/build/CMakeFiles/CMakeDirectoryInformation.cmake" is newer than depender "/Users/chen/Code/clang/build/CMakeFiles/main.dir/depend.internal". 
Scanning dependencies of target main 
make -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/build 
/opt/local/bin/cmake -E cmake_progress_report /Users/chen/Code/clang/build/CMakeFiles 1 
[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o 
/usr/bin/clang++ -arch x86_64 -I/Users/chen/Code/clang -I/opt/local/include -I/System/Library/Frameworks/Python.framework/Headers -I/Users/chen/Code/clang/Utilities/includes -std=c++11 -stdlib=libc++ -o CMakeFiles/main.dir/main.cpp.o -c /Users/chen/Code/clang/main.cpp 

, 미세 컴파일 시스템에, 말 그대로 ++의 libc의 속도 "를 참조하십시오"할 수 있습니다 여기에 컴파일에서 추가 정보입니다. Xcode에서 사용하면 매우 빠르며 libC++로 코드 완성이 훌륭합니다. 난 그냥 내 문제를 파악

+1

빠른 테스트 : 명령 행에'-std = C++ 11 '을 추가하면 도움이됩니까? 누락 된 심볼에서'enable_if'에 대한 참조가 궁금합니다. – mavam

+0

그 플래그를 링커에 추가하는 것을 의미합니까? 그냥 똑같은 결과를 보았습니다. –

+0

나는 실패한 머신에서 어떻게 든 libiconv가 엉망이라고 생각한다. 내 부스트 라이브러리가 해당 컴퓨터에 제대로 구축되지 않았습니다. 그리고 차이점은 iconv (분리됨)가 실패한 시스템에서 No라는 것입니다. 확실하지 왜 비록 –

답변

1

하지만 난 더 즐길 전에, 난 정말이의 하단 싶어 .... 그것은 libiconv가 다른 컴퓨터의 bjam에 의해 인식되지 않기 때문에 Boost가 제대로 컴파일되지 않았기 때문입니다. 아마 인식하지 못한 이유는 아마 macport를 설치했기 때문일 것입니다. 모든 macport 항목을 제거한 직후에 bjam은 libiconv를 인식하고 libC++에서 신호를 제외하고 제대로 빌드 할 수 있지만 괜찮습니다.

관련 문제