Boost logo

Boost Users :

Subject: Re: [Boost-users] cross-compilation x86_64-w64-ming32: undefined reference to `InterlockedIncrement'
From: Frédéric Bron (frederic.bron_at_[hidden])
Date: 2013-09-07 16:21:25


> Could you try commenting so that
> #define BOOST_INTERLOCKED_IMPORT __declspec(dllimport)
> ?

So I forced that:
#define BOOST_INTERLOCKED_IMPORT __declspec(dllimport)
I rebuilt boost with the following commands:
CC=x86_64-w64-mingw32-gcc\
        CXX=x86_64-w64-mingw32-g++\
        ./bootstrap.sh --without-icu --prefix=build --with-toolset=gcc
echo "using gcc : : x86_64-w64-mingw32-g++ :
<compileflags>-DBOOST_THREAD_USE_LIB ;" > user-config.jam
mkdir build
./b2 -d2 -j8 --layout=system --user-config=user-config.jam
--without-mpi --without-python\
        link=static\
        threading=multi\
        runtime-link=shared\
        address-model=64\
        instruction-set=nocona\
        target-os=windows\
        threadapi=win32\
        variant=release\
        install > build/build.log 2>&1

but still got the following error:
x86_64-w64-mingw32-g++ -o mgw64-release/obj/Tests/xuxu2.o -c -O3
-DNDEBUG -DWINDOWS -std=c++11 -Wall -Wextra -pipe -ffloat-store
-I/home/fred/boost-1.54.0/include -DBOOST_DISABLE_ASSERTS
-DBOOST_FILESYSTEM_VERSION=3 -DBOOST_FILESYSTEM_NO_DEPRECATED
-DBOOST_THREAD_USE_LIB -I. Tests/xuxu2.cc
x86_64-w64-mingw32-g++ -o mgw64-release/bin/xuxu2.exe
mgw64-release/obj/Tests/xuxu2.o -Wl,--enable-auto-import -static
-L/home/fred/boost-1.54.0/lib -lboost_thread-mt -lboost_system-mt
-mthreads
mgw64-release/obj/Tests/xuxu2.o:xuxu2.cc:(.text$_ZN5boost6threadD1Ev[_ZN5boost6threadD1Ev]+0x1a):
undefined reference to `InterlockedDecrement'
mgw64-release/obj/Tests/xuxu2.o:xuxu2.cc:(.text.startup+0xf6):
undefined reference to `InterlockedIncrement'
/usr/lib64/gcc/x86_64-w64-mingw32/4.8.1/../../../../x86_64-w64-mingw32/bin/ld:
mgw64-release/obj/Tests/xuxu2.o: bad reloc address 0xf6 in section
`.text.startup'
collect2: error: ld returned 1 exit status

I have also made a minimal example so that anybody can test:
#include <iostream>
#include <boost/thread.hpp>
struct Runner {
                void operator()() const { std::cout<<"Runner::operator()\n"; }
};
int main(int, char*[]) {
        Runner r;
        boost::thread t1(r);
        t1.join();
        return 0;
}

Cheers,

Frédéric


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net