Подтвердить что ты не робот

Ошибка компоновщика STD с Apple LLVM 4.1

У меня есть большая статическая библиотека на С++ с битами Objective-C, первоначально созданной для iOS (armv7).

Я построил версию OS X (64-разрядную версию Intel x86_64), но как только я попытался использовать его в проекте приложения OS X (для Lion 10.7), появилось десятки ошибок компоновщика, большинство из них о стандартных библиотечных символах.

Я знаю, как решить "мои" проблемы с компоновщиками, но скопированные ниже STD прослушивают меня.

"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"

Я проверил мои настройки сборки, мой проект ссылается на стандартную библиотеку (-stdlib=libc++), и я могу использовать std:: cout без каких-либо проблем в моем main.cpp.

Я изменил компилятор в настройках сборки от Apple LLVM 4.1 до LLVM GCC 4.2, и проблема исчезла. Я хочу продолжать использовать Apple LLVM 4.1. Как я могу это исправить?

Спасибо!

4b9b3361

Ответ 1

Измените стандартную библиотеку, связанную с использованием libstdc++ вместо libc++ - проблема в том, что другая библиотека была скомпилирована с использованием режима g++, который использует библиотеку libstdc++.

Рассмотрим следующий пример кода:

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&)

Вы получаете два совершенно разных экспортированных символа. При попытке использовать символ приложение, использующее тот же флаг -stdlib, сможет связать, в то время как приложение, которое не отображает ошибку связи.

Ответ 2

В iOS 7 я использую библиотеку для диаграмм и имею ту же проблему. В этом случае lib stdС++ не решает проблему.

Я добавляю stdС++. 6.dylib к моей фазе сборки и символы найдены.

Ответ 3

У меня возникла эта проблема после того, как все файлы С++ были добавлены в отдельную библиотеку. Я установил параметры всех проектов для использования libС++, но компоновщик не связывается с libС++. Если я добавлю файл С++ в основной проект, проблема исчезнет. Чтобы исправить это, вы можете добавить '-lС++' в раздел "Другие флаги компоновщика" основного проекта. Это заставит XCode ссылаться на libС++.

EDIT: Как сказал другой плакат, XCode может вести себя правильно. Я ожидал, что он сможет добавить ссылку на С++, потому что исходный код С++ lib находится в одном и том же рабочем пространстве.

Ответ 4

У меня была аналогичная проблема, и мне пришлось перейти к "Build Settings", а затем "Apple LLVM 5.1 - Language - С++", а затем изменить "Стандартную библиотеку С++" на libstdС++.

Ответ 5

вы также можете попробовать добавить пустой файл .cpp в свой проект. Это приведет к хитрости xcode в загрузке библиотек stddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd

Ответ 6

В ответ на jlukanta: у меня была та же проблема. Я был осторожен, чтобы выбрать правильный ЗППП, но у меня все еще есть эти ошибки. Но это не ошибка, на самом деле это имеет смысл: зачем Xcode ссылаться на stdlib С++, если у вас нет кода на С++ в вашем проекте?

Конечно, это проблема, когда у вас нет кода на С++ в вашем проекте, но все еще библиотеки С++.