Еще один "ld: символ (ы), не найденный для архитектуры x86_64", проблема с повышением, на этот раз с mgiza
Прошу прощения за такой общий вопрос; Я не могу найти какое-либо решение, которое работает, или я достаточно ясно для меня. Я просто пытаюсь установить mgiza. Вот файл INSTALL:
cmake .
make
make install
If you want to install to a custom location, add the following flag when you run cmake:
-DCMAKE_INSTALL_PREFIX=/path/to/custom/location
NOTE: Boost Version 1.48 has problem with the code, you can use either 1.46 or 1.50+. Unfortunately 1.48 is shipped with Ubuntu 12.04 LTS, you can either download and compile libboost 1.50+ from their website, or just do this:
sudo apt-get install libboost1.46-all-dev
Выглядит просто, не так ли? Ввод текста в cmake .
работает без каких-либо очевидных проблем. К сожалению, make
сталкивается с этой ужасной ошибкой ( "undefined symbols..." ) с boost.
1 warning generated.
Linking CXX executable ../bin/d4norm
Undefined symbols for architecture x86_64:
"std::string::_Rep::_M_destroy(std::allocator<char> const&)", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
"std::string::_Rep::_S_empty_rep_storage", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
"std::string::assign(char const*, unsigned long)", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
По другим вопросам это проблема с Mavericks, потому что он использует clang для компиляции кода С++, подразумевая, что библиотека libС++, а не libstdС++. Для полноты и для того, чтобы другие могли воспроизводить мои ошибки, я использую OS X 10.9.5, Xcode 6.1, а моя версия boost - 1.56 (boost был установлен через homebrew).
Теперь, там должно быть какое-то исправление, верно? Пропустите некоторые из них:
- Применение флага -m32: неприменимо, поскольку Makefile
не имеет в себе никакого "g++", и он также явно указывает мне НЕ
отредактируйте его, потому что это сгенерированный файл "Cmake".
- Не указывать что-то в файле заголовка: неприменимо, потому что код должен быть готов к компиляции.
- Добавление -stdlib = libstdС++ в компоновщик: я не уверен, как добавить это в команду
make
? Я пробовал просто делать make -stdlib=libstdc++
, и, хотя это, казалось, избегало ошибок выше, оно ввело некоторые дополнительные ошибки: make: *** [all] Error 2
(не уверен, что это значит).
- Связывание с соответствующими библиотеками ускорения: Там есть комментарий, в котором говорится: "Вам просто нужно связать с соответствующими библиотеками ускорения... много Q/As о том, как для этого". К сожалению, я не думаю, что какие-либо вопросы, связанные с комментарием, касались моей проблемы.
- Связывание Qt с повышением: Я не думаю, что это применимо, потому что я не использую Qt, и я не знаю, где бы я вставил a
LIBS += [...] boost
.
- Связывание отсутствующего файла: эта проблема больше связана с ссылкой при запуске
g++
, но я использую Makefile, у которого нет g++
где-нибудь в нем.
- Использование g++ vs gcc: я не знаю, как я могу изменить, какой из них я использую, потому что я использую
cmake
и make
...
- Изменение команды связи: Опять же, я не знаю, как изменить компиляцию с
cmake
/make
на gcc
. (Примечание: с этого момента я проигнорирую большинство вопросов, на которые можно ответить, добавив что-то в gcc или g++.)
- Изменение стандартной библиотеки С++: решение подразумевает переход в Xcode и изменение там библиотек. Я не думаю, что это правильный подход, и в любом случае я, вероятно, испортил бы что-то, если бы изменил настройку в Xcode (у меня также нет опыта работы с графическим интерфейсом Xcode).
- Связывание библиотек в Xcode: Я думаю, что это похоже на # 9 в этом списке. Ответ здесь также рекомендует использовать homebrew вместо macports для установки boost, но я уже сказал ранее, что я использовал homebrew для установки boost.
- Скомпилировать с clang: Аналогичная проблема, но как мне получить cmake или сделать компиляцию с clang?
- Из (популярной) проблемы биткойна: Теперь это выглядит интересно! Тон людей столкнулась с моей ошибкой. К сожалению, похоже, нет консенсуса или простого решения. Есть также несколько решений, которые я не знаю для реализации. Например, одно решение "imbolo" заключается в компиляции boost с использованием флага cxxflag, но что это значит?
Итак, я немного потерял, как правильно установить mgiza... Я имею в виду, что весь смысл mgiza, дающий мне cmake
и make
, так что мне не нужно беспокоиться о беспорядочных деталях компиляции вещей, правильно? Это не просто проблема mgiza, хотя, поскольку я столкнулся с этой проблемой при попытке сделать make
в другом месте. Я понимаю идеи высокого уровня (C) Make файлов, но не детали низкого уровня.
Ответы
Ответ 1
Чтобы устранить некоторые проблемы, высказанные комментаторами: лучший способ справиться с этой проблемой - попытаться максимально очистить систему и начать процесс с нуля.
Кроме того, поскольку это было опубликовано, была выпущена OS X 10.10 Yosemite, что, возможно, устранило эту проблему (IIRC эта проблема в основном связана с 10.9 и изменениями clang/gcc-complier).