Проблема компиляции Boost.asio: неопределенная ссылка на `__sync_add_and_fetch_8 - PullRequest
1 голос
/ 03 апреля 2011

Эй, ребята, это может быть нубский вопрос, но я действительно не могу найти никакого полезного решения через Google.Я тестирую hello world с boost.asio, программа довольно проста:

#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
int main()
{
    boost::asio::io_service io;
    boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
    t.wait();
    std::cout << "Hello, world!\n";
    return 0;
}

Я прошел компиляцию и хорошо запускаюсь на своем Intel Pentium PC (Ubuntu 10.10, gcc 4.4.5, Boost 1.46.0) .Командная строка, которую я использовал, была

g ++ -oa a.cpp -I / Boost-Include-Path / -L / Boost-lib-Path / -lboost_system

Но когда я компилирую тот же код на другом компьютере (который является большим, я объясню это позже), он не может пройти компиляцию и выдает такие ошибки:


/tmp / ccOZxZBX.o: в функции boost::asio::detail::gcc_sync_fenced_block::gcc_sync_fenced_block()': a.cpp:(.text._ZN5boost4asio6detail21gcc_sync_fenced_blockC1Ev[boost::asio::detail::gcc_sync_fenced_block::gcc_sync_fenced_block()]+0x4c): undefined reference to __ sync_lock_test_and_set_4 '/tmp/ccOZxZBX.o: в функции boost::detail::atomic_count::operator++()': a.cpp:(.text._ZN5boost6detail12atomic_countppEv[boost::detail::atomic_count::operator++()]+0x30): undefined reference to __ sync_add_and_fetch_8' /tmp/ccOZxZBX.o: в функции boost::detail::atomic_count::operator--()': a.cpp:(.text._ZN5boost6detail12atomic_countmmEv[boost::detail::atomic_count::operator--()]+0x30): undefined reference to ____0_x_0boost::detail::atomic_count::operator long() const': a.cpp:(.text._ZNK5boost6detail12atomic_countcvlEv[boost::detail::atomic_count::operator long() const]+0x30): undefined reference to __ sync_fetch_and_add_8 '


Я использовал машину SiCortex SC5832, в которой используются процессоры набора команд MIPS64, изменилась ОС CentoOS.Gcc 4.2.3, Boost1.46.0.Возможно ли, что есть проблемы с совместимостью MIPS?Я добавил опцию -mips64, но все равно выдает те же ошибки.Я знаю, что эта среда не может быть очень обычной, но я думаю, что некоторые люди, использующие похожие большие машины, могут столкнуться с той же проблемой.Кстати, у меня нет разрешения sudo.

Спасибо, Тони

1 Ответ

1 голос
/ 04 апреля 2011

Эта функция является встроенной функцией GCC и была представлена ​​в GCC 4.2 (iirc) , см. Документацию .

В соответствии с документацией она доступна не на всех целевых процессорах.

Если вы посмотрите на boost/smart_ptr/detail/atomic_count.hpp, похоже, он попадет в блок #elif defined(BOOST_SP_HAS_SYNC).то есть boost/smart_ptr/detail/atomic_count_sync.hpp.

Поддержка для этого определяется в boost/smart_ptr/detail/sp_has_sync.hpp.Этот заголовок по существу предполагает, что GCC поддерживает это на всех платформах, за исключением нескольких исключений.Возможно, вы захотите вставить MIPS в качестве еще одного исключения и отправить патч для повышения.

Вы также увидите, что одним из обходных путей является определение BOOST_AC_USE_PTHREADS .При этом будет использоваться мьютекс вокруг атомного счета, который, вероятно, значительно менее эффективен, но, по крайней мере, он будет работать, пока вы не сможете выяснить, какие атомарные операции поддерживаются в MIPS64.

...