SORU
10 Aralık 2011, CUMARTESİ


Neden c 0 x modunda C kütüphanesi ile't ise bu artış link::program_options örnek?

Artırmak için bu örnek kodu derleme::program_options: http://svn.boost.org/svn/boost/trunk/libs/program_options/example/first.cpp

MacOS Lion (10.7.2), kullanarak 1.48.0 artırmak MacPorts ile yüklü

$ clang   -v
Apple clang version 3.0 (tags/Apple/clang-211.12) (based on LLVM 3.0svn)
Target: x86_64-apple-darwin11.2.0
Thread model: posix
$ clang   -std=c  0x --stdlib=libc   -lc   -I/opt/local/include -L/opt/local/lib -lboost_program_options first.cpp -o first
Undefined symbols for architecture x86_64:
  "boost::program_options::options_description::options_description(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int, unsigned int)", referenced from:
      _main in cc-6QQcwm.o
  "boost::program_options::operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, boost::program_options::options_description const&)", referenced from:
      _main in cc-6QQcwm.o
  "boost::program_options::abstract_variables_map::operator[](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const", referenced from:
      boost::program_options::variables_map::operator[](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const in cc-6QQcwm.o
  "boost::program_options::detail::cmdline::set_additional_parser(boost::function1<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&>)", referenced from:
      boost::program_options::basic_command_line_parser<char>::extra_parser(boost::function1<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&>) in cc-6QQcwm.o
  "boost::program_options::detail::cmdline::cmdline(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&)", referenced from:
      boost::program_options::basic_command_line_parser<char>::basic_command_line_parser(int, char const* const*) in cc-6QQcwm.o
  "boost::program_options::to_internal(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > boost::program_options::to_internal<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&) in cc-6QQcwm.o
  "boost::program_options::invalid_option_value::invalid_option_value(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      void boost::program_options::validate<int, char>(boost::any&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, int*, long) in cc-6QQcwm.o
  "boost::program_options::validation_error::validation_error(boost::program_options::validation_error::kind_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const& boost::program_options::validators::get_single_string<char>(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, bool) in cc-6QQcwm.o
  "boost::program_options::value_semantic_codecvt_helper<char>::parse(boost::any&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, bool) const", referenced from:
      vtable for boost::program_options::typed_value<int, char> in cc-6QQcwm.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Aynı kodu/derlenmiş g 4.7 ile bağlantılı MacPorts ile yüklü

$ g  -mp-4.7 -std=c  0x -I/opt/local/include -L/opt/local/lib -lboost_program_options -o first first.cpp

... gayet iyi çalışıyor. Olarak kütüphanenin olmadan çınlama kullanarak yapar :

clang   -std=c  0x -I/opt/local/include -L/opt/local/lib -lboost_program_options first.cpp -o first

Sorun ne? Neden destek yok::program_options ve kütüphanenin birlikte çalışmıyoruz?

CEVAP
10 Aralık 2011, CUMARTESİ


Kullanarak destek çınlama -stdlib=kütüphanenin yeniden gerekir .

kütüphanenin gds'ler libstdc (yeni operatör gibi bazı düşük seviyeli şeyler hariç) ikili uyumlu değil. Örneğin gcc. libstdc std::string C kütüphanesi olarak kullanır oysa refcounted, "kısa dize optimizasyonu". Eğer yanlışlıkla aynı programda bu iki dize karışımı olsaydı (ve aynı veri yapısı için onları hata), kaçınılmaz olarak çalıştırma bir kaza olacaktı.

Bu kaza sizin durumunuzda oluştu tam olarak budur.

Bağlantı zaman bir hata bu run time crash açmak için, kütüphanenin C 11 bir dil kullanır özelliği inline namespace değiştirmeye çağırdıABİstd::string etkilemedenAPIstd::string. O, sana std::string aynı görünüyor. Ama linker için, std::string eğer ad gibi karıştırılmış 12**. Böylece linker std::basic_string std::__1::basic_string iki farklı veri yapıları (eski gds'ler libstdc gelen ve ikinci kütüphanenin gelen) olduğunu bilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Austin Evans

    Austin Evans

    5 AĞUSTOS 2007
  • MrMimoB

    MrMimoB

    11 NİSAN 2011
  • williamfitzsimmons

    williamfitzs

    14 Mart 2008