mingw64와 관련된 모든 패키지가 설치된 Fedora 19 x86_64 컴퓨터에 있습니다. 나는 개인 C++ 프로젝트에서 작업을하고 있었고, thread-safe로 만들기로 결정하여 Boost.thread 동기화 객체를 시도하기로 결정했습니다. 곧 필자는 InterlockedCompareExchange와 관련된 링커 오류를 잡기 시작했습니다. 여기 InterlockedCompareExchange에 대한 정의되지 않은 참조가 mingw64의 boost.thread와 같습니다 (그러나 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};
}
명령 줄 (I 말이 더 비 멀티 쓰레드 버전이 없기 때문에 -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): 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의 버그인가? 그것은 mingw의 Windows 버전과 컴파일합니까?
편집 : 그것은 내가 여전히 같은 결과를 얻는 계속 사실 mingw64 패키지
이 질문은 버그 신고이므로 불쾌한 것으로 보였습니다. – rubenvb
최근에 수정되었습니다. Fedora repos에서 toolchain을 업데이트 해보십시오. 이 문제가 다시 발생하면 Stackoverflow를 수정 프로그램으로 사용하는 대신 Fedora 추적기에 버그 보고서를 제출하십시오. – rubenvb
나는이 문제로 인해 CreateThread와 windows-only (sucks) MINGW64/GCC 4.7.1을 통해 boost :: thread를 사용을 포기했다 (Irrlicht가 64 비트를 빌드 할 수 없기 때문에 -m32를 빌드해야 함). 내 생각 엔 ... :(일부는 64 비트 MINGW가 여전히 -m32이고 _Interlocked와 친구들이 실패하지 못하도록 해결하기위한 해결 매크로를 올리면 나타남을 정의합니다. 심지어 .cpp 파일 중 하나에서 스텁을 만들려고 시도했습니다. _Itnerlocked * 함수가 작동하지 않고 여전히 링커를 지나칠 수 없었습니다. –