Error del enlazador STD con Apple LLVM 4.1


Tengo una gran biblioteca estática en C++ con bits de Objective-C originalmente construidos para iOS (armv7).

Construí una versión de OS X (Intel x86_64 de 64 bits), pero tan pronto como traté de usarla en un proyecto de aplicación de OS X (dirigido a Lion 10.7), aparecieron decenas de errores de enlazador, la mayoría de ellos sobre símbolos de biblioteca estándar.

Sé cómo resolver "mis" problemas de enlazador, pero los STD copiados a continuación me están molestando.

"std::basic_filebuf<char, std::char_traits<char> >::is_open() const"
"std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const"
"std::basic_ios<char, std::char_traits<char> >::widen(char) const"
"std::istream& std::istream::_M_extract<double>(double&)"
"std::ostream::put(char)"
"std::ostream::flush()"
"std::ostream& std::ostream::_M_insert<void const*>(void const*)"
"std::ostream& std::ostream::_M_insert<bool>(bool)"
"std::ostream& std::ostream::_M_insert<double>(double)"
"std::ostream& std::ostream::_M_insert<unsigned long>(unsigned long)"
"std::ostream::operator<<(int)"
"std::ostream::operator<<(short)"
"std::string::_Rep::_M_destroy(std::allocator<char> const&)"
"std::string::_Rep::_S_terminal"
"std::string::_Rep::_S_empty_rep_storage"
"std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&)"
"std::string::append(char const*, unsigned long)"
"std::string::append(std::string const&)"
"std::string::assign(std::string const&)"
"std::string::reserve(unsigned long)"
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)"
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)"
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()"
"std::basic_ofstream<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode)"
"std::basic_ofstream<char, std::char_traits<char> >::close()"
"std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream()"
"std::basic_ofstream<char, std::char_traits<char> >::~basic_ofstream()"
"std::_List_node_base::hook(std::_List_node_base*)"
"std::_List_node_base::unhook()"
"std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream(std::string const&, std::_Ios_Openmode)"
"std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream(std::_Ios_Openmode)"
"std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_stringstream()"
"std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::basic_ostringstream(std::_Ios_Openmode)"
"std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_ostringstream()"
"std::ios_base::Init::Init()"
"std::ios_base::Init::~Init()"
"std::basic_ios<char, std::char_traits<char> >::clear(std::_Ios_Iostate)"
"std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)"
"std::_Rb_tree_decrement(std::_Rb_tree_node_base*)"
"std::_Rb_tree_increment(std::_Rb_tree_node_base const*)"
"std::_Rb_tree_increment(std::_Rb_tree_node_base*)"
"std::__throw_logic_error(char const*)"
"std::__throw_length_error(char const*)"
"std::__throw_out_of_range(char const*)"
"std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)"
"std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)"
"std::cerr"
"std::cout"

Revisé mi configuración de compilación, mi proyecto enlaza con el biblioteca estándar (-stdlib=libc++) y puedo usar std::cout sin ningún problema en mi principal.cpp.

Cambié el compilador en la configuración de compilación de Apple LLVM 4.1 a LLVM GCC 4.2 y el problema desapareció. Quiero seguir usando Apple LLVM 4.1. ¿Cómo puedo arreglar eso?

Gracias!

Author: antho, 2012-10-16

6 answers

Cambie la biblioteca estándar que está vinculada a use libstdc++ en lugar de libc++ - el problema es que la otra biblioteca se compiló utilizando el modo g++ que utiliza la biblioteca libstdc++.

Considere el siguiente código de ejemplo:

dhcp-191:~/Development/testy/fred% cat fred.cpp
#include <iostream>
#include <string>
#include "fred.h"

using namespace std;

bool dofred(string &x)
{
    cout << x << endl;
    return true;
}
dhcp-191:~/Development/testy/fred% cat fred.h

#include <iostream>
#include <string>

bool dofred(std::string &x);

dhcp-191:~/Development/testy/fred% clang++ -stdlib=libc++ -shared -o fred.dylib fred.cpp
dhcp-191:~/Development/testy/fred% nm fred.dylib | c++filt | grep dofred
0000000000000fa0 T dofred(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&)
dhcp-191:~/Development/testy/fred% clang++ -stdlib=libstdc++ -shared -o fred.dylib fred.cpp
dhcp-191:~/Development/testy/fred% nm fred.dylib | c++filt | grep dofred                     
0000000000000e30 T dofred(std::string&)

Se obtienen dos símbolos exportados completamente diferentes. Al intentar usar el símbolo, la aplicación que usa la misma bandera -stdlib podrá vincular, mientras que la aplicación que no lo hace mostrará un error de enlace.

 45
Author: Petesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-02 14:14:59

En iOS 7 uso una biblioteca para gráficos y tengo el mismo problema. En este caso lib stdc++ no resuelve el problema.

Agrego el stdc++.6.dylib a mi fase de construcción y los símbolos se encuentran.

 46
Author: gzfrancisco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-29 22:47:11

Tuve este problema después de poner todos los archivos C++ en una biblioteca separada. Establecí la configuración de todos los proyectos para usar libc++, pero el enlazador no enlaza con libc++. Si agrego un archivo C++ al proyecto principal, el problema desaparecería. Para solucionar esto, puede agregar '-lc++' en la sección "Otros indicadores de enlace" del proyecto principal. Esto forzaría a XCode a enlazar a libc++.

EDIT: Como dijo el otro poster, XCode puede estar comportándose correctamente. Yo esperaba que supiera agregar enlace C++ porque el código fuente de C++ lib está en el mismo espacio de trabajo.

 11
Author: jlukanta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-24 08:17:00

Acabo de tener un problema similar, y tuve que ir a "Build Settings" y luego "Apple LLVM 5.1 - Language - C++" y luego cambiar la "Biblioteca Estándar de C++" a libstdc++.

 3
Author: djacobs7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-22 18:31:19

También puede intentar agregar un vacío .archivo cpp a su proyecto. Esto engañará a xcode para que cargue bibliotecas std de C++

 1
Author: Lee Irvine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-02 20:03:40

En respuesta a jlukanta: Yo tenía el mismo problema. He tenido cuidado de elegir la ETS correcta, pero todavía tengo esos errores. Pero eso no es un error, en realidad tiene sentido: ¿Por qué debería Xcode vincularse con el stdlib de c++ si no tiene ningún código de C++ en su proyecto?

Por supuesto, esto es un problema cuando no tiene código C++ en su proyecto, pero sigue teniendo bibliotecas C++.

 0
Author: user2073196,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-14 18:36:17