ссылка на clang ++ на OS X генерирует много символов, не найденных ошибок

Я пытаюсь скомпилировать код C ++ (включая возможности C ++ 11) в OS X 10.8 с помощью компилятора clang ++. У меня есть make-файл, который генерирует объектные файлы в порядке, а затем в команде:

clang++ -o Analysis.so -shared DataFile.o CR39DataFile.o 

Я получаю массу ошибок о символах, которые не найдены для архитектуры x86_64. Код отлично работает в системе * nix, используя g ++ и соответствующим образом изменяя флаги компилятора для поддержки C ++ 11. Чтобы скомпилировать * .o, я делаю это так:

 clang++ -c -Wall -std=c++11 -stdlib=libc++ -I../src ../src/DataFile.cc 

Изменить: вывод команды связывания:

 clang++ -o Analysis.so -shared DataFile.o CR39DataFile.o Undefined symbols for architecture x86_64: "std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >::find(char const*, unsigned long, unsigned long) const", referenced from: CR39DataFile::read_thread(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >) in CR39DataFile.o "std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >::find(char, unsigned long) const", referenced from: CR39DataFile::trim(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >) in CR39DataFile.o "std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >::compare(char const*) const", referenced from: CR39DataFile::read_thread(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >) in CR39DataFile.o "std::__1::__vector_base_common::__throw_length_error() const", referenced from: std::__1::vector<frame*, std::__1::allocator >::__append(unsigned long) in CR39DataFile.o std::__1::vector<std::__1::vector<frame*, std::__1::allocator >*, std::__1::allocator<std::__1::vector<frame*, std::__1::allocator >*> >::__append(unsigned long) in CR39DataFile.o "std::__1::__vector_base_common::__throw_out_of_range() const", referenced from: std::__1::vector<std::__1::vector<frame*, std::__1::allocator >*, std::__1::allocator<std::__1::vector<frame*, std::__1::allocator >*> >::at(unsigned long) in CR39DataFile.o std::__1::vector<frame*, std::__1::allocator >::at(unsigned long) in CR39DataFile.o "std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >::erase(unsigned long, unsigned long)", referenced from: CR39DataFile::trim(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >) in CR39DataFile.o "std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >::assign(char const*)", referenced from: CR39DataFile::CR39DataFile() in CR39DataFile.o CR39DataFile::clear() in CR39DataFile.o "std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >::insert(unsigned long, unsigned long, char)", referenced from: CR39DataFile::read_thread(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >) in CR39DataFile.o "std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >::resize(unsigned long, char)", referenced from: CR39DataFile::read_thread(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >) in CR39DataFile.o "std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >::reserve(unsigned long)", referenced from: CR39DataFile::read_thread(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >) in CR39DataFile.o "std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >::basic_string(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&)", referenced from: DataFile::read(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&, bool) in DataFile.o DataFile::write(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&, bool) in DataFile.o std::__1::thread::thread<bool (DataFile::*)(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >), DataFile*, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&, void>(bool (DataFile::*)(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >)&&, DataFile*&&, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&&&) in DataFile.o CR39DataFile::read_thread(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >) in CR39DataFile.o CR39DataFile::write_thread(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >) in CR39DataFile.o CR39DataFile::write_thread(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >, float, float, float, float, float, float, float, float, float, float) in CR39DataFile.o CR39DataFile::write_thread(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >, float, float, float, float, float, float) in CR39DataFile.o ... "std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >::basic_string(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&, unsigned long, unsigned long, std::__1::allocator const&)", referenced from: CR39DataFile::read_thread(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >) in CR39DataFile.o "std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >::~basic_string()", referenced from: DataFile::~DataFile() in DataFile.o DataFile::read(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&, bool) in DataFile.o DataFile::write(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&, bool) in DataFile.o std::__1::thread::thread<bool (DataFile::*)(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >), DataFile*, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&, void>(bool (DataFile::*)(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >)&&, DataFile*&&, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&&&) in DataFile.o void* std::__1::__thread_proxy<std::__1::tuple<bool (DataFile::*)(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >), DataFile*, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > > >(void*) in DataFile.o std::__1::__tuple_leaf<2ul, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >, false>::~__tuple_leaf() in DataFile.o CR39DataFile::CR39DataFile() in CR39DataFile.o ... "std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >::operator=(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&)", referenced from: CR39DataFile::set_file_path(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >) in CR39DataFile.o CR39DataFile::set_file_auxpath(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >) in CR39DataFile.o "std::__1::__thread_struct::__thread_struct()", referenced from: void* std::__1::__thread_proxy<std::__1::tuple<bool (DataFile::*)(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >), DataFile*, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > > >(void*) in DataFile.o "std::__1::__thread_struct::~__thread_struct()", referenced from: std::__1::__thread_specific_ptr::reset(std::__1::__thread_struct*) in DataFile.o "std::__1::__thread_local_data()", referenced from: void* std::__1::__thread_proxy<std::__1::tuple<bool (DataFile::*)(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >), DataFile*, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > > >(void*) in DataFile.o "std::__1::__throw_system_error(int, char const*)", referenced from: std::__1::thread::thread<bool (DataFile::*)(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >), DataFile*, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&, void>(bool (DataFile::*)(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >)&&, DataFile*&&, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&&&) in DataFile.o "std::__1::thread::~thread()", referenced from: DataFile::cleanup_file_io() in DataFile.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: *** [Analysis.so] Error 1 

Я подозреваю, что эта проблема связана с двумя библиотеками времени выполнения C ++, доступными в OS X. Для связывания динамической библиотеки используйте следующую ссылку:

 clang++ -stdlib=libc++ -o Analysis.dylib -shared DataFile.o CR39DataFile.o 

(the -stdlib=libc++ является ключевым отличием). Я думаю, что среда исполнения C ++ по умолчанию – это реализация GNU, которая запутывает компоновщик при компиляции с реализацией libc ++.

  • Поиск других компьютеров в сети по командной строке
  • Безопасно ли установить Mac непосредственно в Интернет?
  • Как зашифровать несколько файлов в отдельные архивы?
  • Java -version сообщает о неправильной версии на Mac OSX Mountain Lion
  • Как вы можете автоматически запускать скрипт после подключения к VPN на OS X?
  • Как включить учетную запись root в Mac OS X?
  • Добавление раздела NTFS на диск в Windows делает раздел HFS + на том же диске невидимым в Mac OS X
  • Постройте Multiarch OpenSSL на OS X
  • PHP для Mac OS X
  • Адрес гостевой системы VMWare Fusion Linux по имени хоста?
  • Как сказать rsync пропустить файлы на поврежденном блоке жесткого диска, а не застревать, пытаясь его прочитать
  • Давайте будем гением компьютера.