Я нахожусь на компьютере fedora 19 x86_64, с mingw64 и всеми соответствующими пакетами. Я работал над личным проектом на C++, и я решил сделать его потокобезопасным, и поэтому я решил попробовать объекты синхронизации Boost.thread. Как только я это сделал, я начал получать ошибки компоновщика, связанные с InterlockedCompareExchange. Следующая тестовая программа иллюстрирует мою точку:Неопределенная ссылка на InterlockedCompareExchange с boost.thread на mingw64 (но не на mingw32)
#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-мт, потому что нет, не многопоточной версии, которая имеет смысл):
$ 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): undefined reference to `InterlockedCompareExchange' collect2: error: ld returned 1 exit status
Но 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?
Edit: на самом деле это сделал, поэтому она должна быть ошибка в фетровой шляпе mingw64 пакет
Этот вопрос не соответствует теме, потому что это отчет об ошибке. – rubenvb
Это последнее исправление. Попробуйте обновить свою инструментальную цепочку из репозиториев Fedora. Если вы снова это испытаете, отправьте отчет об ошибке в трекер Fedora вместо использования Stackoverflow в качестве исправления. – rubenvb
Я отказался от использования boost :: thread через MINGW64/GCC 4.7.1 (должен построить -m32 из-за того, что Irrlicht не может построить 64-разрядную версию) из-за этой проблемы CreateThread и windows-only (sucks) это Я предполагаю ... :(Некоторые определяют, указывает ли 64-битный MINGW, все еще верны, когда -m32 и вытаскивает макросы обхода решения, чтобы исправить ошибки _Interlocked и друзей из-за сбоя. Я даже попытался создать заглушку в одном из моих .cpp-файлов для сбойные функции _Itnerlocked * и до сих пор не могли получить его за компоновщик. –