Я на компьютере с Fedora 19 x86_64, на котором установлен mingw64 и все соответствующие пакеты. Я работал над личным проектом на c ++ и решил сделать его поточно-ориентированным, поэтому решил попробовать синхронизировать объекты Boost.thread. Как только я это сделал, я начал получать ошибки компоновщика, связанные с InterlockedCompareExchange. Следующая тестовая программа иллюстрирует мою точку зрения:
#include <boost/thread/locks.hpp>
#include <boost/thread/shared_mutex.hpp>
int main()
{
boost::shared_mutex mtx;
boost::unique_lock<decltype(mtx)> lck{mtx};
}
Вот командная строка (я поставил -lboost_thread-mt, потому что нет не многопоточной версии, что имеет смысл):
$ x86_64-w64-mingw32-g ++ -std = c ++ 11 test.cpp -o test
-I / usr / x86_64-w64-mingw32 / sys-root / mingw / include -L / usr / x86_64-w64-mingw32 / sys-root / mingw / lib -lboost_thread-mt -lboost_system/tmp/cc4Wh6PO.o:test.cpp:(.text$_ZN5boost12shared_mutex28interlocked_compare_exchangeINS0_10state_dataEEET_PS3_S3_S3_[_ZN5boost12shared_mutex28interlocked_compare_exchangeINS0_10state_dataEEET_PS3_S3_S3_]+0x2f):
неопределенная ссылка на InterlockedCompareExchange collect2: error:
ld вернул 1 статус выхода
Но с mingw32 он компилируется как шарм:
$ i686-w64-mingw32-g ++ -std = c ++ 11 test.cpp -o test
-I / usr / i686-w64-mingw32 / sys-root / mingw / include -L / usr / i686-w64-mingw32 / sys-root / mingw / lib -lboost_thread-mt -lboost_system
У меня вопрос: я делаю что-то не так или это ошибка в mingw64? Это компилируется с версией Windows MINGW?
Изменить: на самом деле это так, поэтому это должно быть ошибка в пакете fedora mingw64
На основании этой страницы http://sourceforge.net/apps/trac/mingw-w64/wiki/Building%20Boost, Вы можете добавить define = BOOST_USE_WINDOWS_H, чтобы избежать этой ошибки компоновки. Меня устраивает.
На самом деле я продолжаю получать те же результаты, поэтому обязательно сообщу об этом. Спасибо
Я столкнулся с подобной проблемой неопределенной ссылки на функции Interlocked *.
Насколько я знаю, mingw64 rev2 из проекта MinGWBuilds (на sf) работает, а rev3 не работает. Поэтому я верю, что в MinGW64 что-то изменилось.