Включение boost::filesystem приводит к ошибкам компоновки

Хорошо, во-первых, я ссылаюсь на boost_system и boost_filesystem.

Мой компилятор представляет собой пользовательскую сборку MinGW с GCC 4.3.2

Итак, когда я включаю:

#include "boost/filesystem.hpp"

Я получаю ошибки связывания, такие как:

..\..\libraries\boost\libs\libboost_system.a(error_code.o):error_code.cpp:
    (.text+0xe35)||undefined reference to `_Unwind_Resume'|

..\..\libraries\boost\libs\libboost_system.a(error_code.o):error_code.cpp:
    (.eh_frame+0x12)||undefined reference to `__gxx_personality_v0'|

После небольшого поиска я обнаружил, что чаще всего это происходит, когда вы пытаетесь скомпоновать программу на C++ с помощью gcc, компилятора GNU C. Но я распечатал точную команду сборки, которую выполняет Code::Blocks, и она определенно линкуется с g++. .

Если я закомментирую это включение, все будет работать нормально.

Любые идеи? Кроме того, кто-нибудь знает хорошее место, где можно получить двоичные файлы Windows для ускорения? Система сборки вызывает у меня проблемы, поэтому я использую некоторые двоичные файлы, поставляемые с этим специальным пакетом MinGW


person Adam    schedule 29.01.2009    source источник
comment
Для дальнейшего использования: ошибка __gxx_personality_v0 является признаком отсутствия ссылки на libstdc++, библиотеку времени выполнения GCC C++. Это происходит, если вы связываетесь с gcc (и не -lstdc++) вместо g++ или если ваши версии среды выполнения C++ не совпадают.   -  person ephemient    schedule 30.01.2009
comment
отлично, я не знал этого, спасибо за информацию   -  person Adam    schedule 30.01.2009


Ответы (2)


Хорошо, я нашел проблему. Это немного запутанно.

GCC постепенно становится более совместимым с IS 14882 в ветке 4.x. По мере продвижения они удаляют устаревшие функции подачи жалоб на нестандартность.

В то время как в 4.1.x они, похоже, только устарели и не удалены, в 4.3.x, похоже, они действительно удалены. Это означает, что 4.3.x и выше имеют некоторые проблемы обратной совместимости с вещами, скомпилированными в ветке 3.x (в которой использовались устаревшие и теперь удаленные функции).

Я использовал смешанную комбинацию двоичных файлов, которые были скомпилированы с помощью GCC 3.x, 4.1.x и 4.3.x, поэтому независимо от того, какой из них я использовал, я получал аналогичную ошибку, потому что по крайней мере один двоичный файл я связывал с был несовместим с компилятором, который я пробовал в данный момент.

Сейчас я использую GCC 4.1.2, и большинство моих двоичных файлов были скомпилированы с его помощью. Я до сих пор использую несколько двоичных файлов из 3.x, поэтому пока не обновляюсь до 4.3.x.

Надеюсь, читать было менее запутанно, чем писать...

Это кажется хорошим постом, посвященным некоторым проблемам, которые были в версии 4.1.x.

person Adam    schedule 29.01.2009
comment
Насколько я знаю, GCC 2.95, 2.96, 3.0, 3.1.1, 3.2 и 3.4 нарушили совместимость C++ ABI с предыдущими версиями, поэтому вы не можете смешивать двоичные файлы между ними. Теоретически версии 3.4 и выше (включая 4.x, как мне кажется) должны быть совместимы, по крайней мере, до тех пор, пока они снова не нарушат совместимость... - person ephemient; 30.01.2009

Двоичные файлы Windows: www.boost.org — см. страницу «Начало работы» — но если вы используете g++ на MingGW, они вам не нужны. Простой способ понять это: MingGW похож на операционную систему внутри операционной системы, поэтому на самом деле вы не используете Windows. Те, что у вас есть, вероятно, правы.

Не уверен, что происходит с вашим кодом, похоже, что файлы lib каким-то образом не связаны должным образом. Boost называет свои файлы lib сами по себе, поэтому вы на самом деле не называете их явно, но вы должны иметь файлы lib для boost по правильному пути (и убедитесь, что они также установлены/построены, что может быть не так). Я не уверен, как направить их по правильному пути с помощью g++, потому что я не использовал MingGW, я использовал только повышение с Visual Studio.

person Ray Hidayat    schedule 29.01.2009