2012-04-28 158 views
1

我仍在努力與libC++和boost。鏈接libC++編譯提升

我編譯的libC++升壓喜歡這裏: How to compile/link Boost with clang++/libc++?

現在我在我的機器上的一個看到這個編譯錯誤,而另外一個與編譯確切的代碼完全正常。它們都有相同的編譯器版本,環境變量也是一樣的。

以下是錯誤:

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 

我仍然堅持與ABI不兼容問題?

下面是代碼:

#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 2012-04-28 01:16:40

+0

你的意思是將該標誌添加到鏈接器中,對嗎?剛剛嘗試過,結果相同。 – 2012-04-28 02:26:23

+0

我想在失敗的機器上,不知何故libiconv可能會搞砸了。我的boost庫在該機器上沒有正確構建。我注意到不同的是,iconv(單獨)在失敗的機器上是No。不知道爲什麼 – 2012-04-28 06:10:19

回答

1

我只是想出了我的問題。這是由於Boost編譯不正確,因爲libiconv在我的另一臺機器上沒有被bjam識別。我猜它沒有被識別的原因可能是因爲我安裝了macport。立即在我卸載所有的macport的東西后,bjam可以識別libiconv並在libC++下正確構建boost,除了信號,但沒關係。