You are here

Building problems with MingW32

Greetings.

I've been using MRPT for a while on Linux. Recently I was requested to port my project to Windows 7 (Ultimate x64).
I'm using C::B and Mingw32 (the one from http://tdm-gcc.tdragon.net/).

I downloaded and tested both the MRPT 0.94 precompiled packages from http://www.mrpt.org/Downloads and also the latest from svn (0.95). Building in Mingw32 failed for both cases (BTW: building or MRPT in Visual Studio 2010 works like a charm) As instructed in http://www.mrpt.org/Building_and_Installing_Instructions#Special_instruc..., I built successfully both OpenCV and wxWidgets using mingw32 (everything 32 bits).

Mostly there are two errors:
1. Compilation of CWirelessPower.cpp fails due to missing wlanapi
I suppose I have to install wlanapi in mingw and that will fix this problem, but it was not mentioned on the above guide.
Anyway, to move on I removed CWirelessPower.cpp and CWirelessPower.h files from base utils as they're not referred elsewhere and continue.
2. Building of library libmrpt-maps fails. I include the output:
Scanning dependencies of target mrpt-maps
[ 64%] Building CXX object libs/maps/CMakeFiles/mrpt-maps.dir/src/maps/CBeacon.cpp.obj
[ 64%] Building CXX object libs/maps/CMakeFiles/mrpt-maps.dir/src/maps/CBeaconMap.cpp.obj
[ 65%] Building CXX object libs/maps/CMakeFiles/mrpt-maps.dir/src/maps/CColouredPointsMap.cpp.obj
[ 65%] Building CXX object libs/maps/CMakeFiles/mrpt-maps.dir/src/maps/CGasConcentrationGridMap2D.cpp.obj
[ 65%] Building CXX object libs/maps/CMakeFiles/mrpt-maps.dir/src/maps/CHeightGridMap2D.cpp.obj
[ 65%] Building CXX object libs/maps/CMakeFiles/mrpt-maps.dir/src/maps/COccupancyGridMap2D.cpp.obj
[ 65%] Building CXX object libs/maps/CMakeFiles/mrpt-maps.dir/src/maps/CPointsMap.cpp.obj
[ 65%] Building CXX object libs/maps/CMakeFiles/mrpt-maps.dir/src/maps/CReflectivityGridMap2D.cpp.obj
[ 65%] Building CXX object libs/maps/CMakeFiles/mrpt-maps.dir/src/maps/CSimplePointsMap.cpp.obj
[ 66%] Building CXX object libs/maps/CMakeFiles/mrpt-maps.dir/src/opengl/CAngularObservationMesh.cpp.obj
[ 66%] Building CXX object libs/maps/CMakeFiles/mrpt-maps.dir/src/opengl/CPlanarLaserScan.cpp.obj
[ 66%] Building CXX object libs/maps/CMakeFiles/mrpt-maps.dir/src/precomp_hdr.cpp.obj
[ 66%] Building CXX object libs/maps/CMakeFiles/mrpt-maps.dir/src/registerAllClasses.cpp.obj
Linking CXX shared library ..\..\bin\libmrpt-maps094.dll
Cut@Cャオト「ワキ: ..\..\lib\libmrpt-maps094.dll.a
CMakeFiles\mrpt-maps.dir/objects.a(CBeacon.cpp.obj):CBeacon.cpp:(.text+0x3db5): undefined reference to `_imp___ZN4mrpt6opengl14posePDF2openglINS_5poses9CPointPDFENS0_16CSetOfObjectsPtrEEET0_RKT_'
collect2: ld ヘXe[^X 1 ナIケオワオス
mingw32-make[2]: *** [bin/libmrpt-maps094.dll] G[ 1
mingw32-make[1]: *** [libs/maps/CMakeFiles/mrpt-maps.dir/all] G[ 2
mingw32-make: *** [all] G[ 2

(sorry for the garbled messages, my OS is in Japanese)
As to this error I have no idea.

From the successful experiences with mingw32, any clue as to what I'm missing here will be highly appreciated.

Thanks.

PS: the verbose version of the compile line is:

Linking CXX shared library ..\..\bin\libmrpt-maps094.dll
cd C:\PROGRA~2\MRPT-0~1.4-3\RELEAS~1\libs\maps && "C:\Program Files (x86)\CMake 2.8\bin\cmake.exe" -E make_link_script CMakeFiles\mrpt-maps.dir\link.txt --verbose=1
"C:\Program Files (x86)\CMake 2.8\bin\cmake.exe" -E remove -f CMakeFiles\mrpt-maps.dir/objects.a
C:\MinGW32\bin\ar.exe cr CMakeFiles\mrpt-maps.dir/objects.a @CMakeFiles\mrpt-maps.dir\objects1.rsp
C:\MinGW32\bin\g++.exe -shared -o ..\..\bin\libmrpt-maps094.dll -Wl,--out-implib,..\..\lib\libmrpt-maps094.dll.a -Wl,--major-image-version,0,--minor-image-version,9 -Wl,--whole-archive CMakeFiles\mrpt-maps.dir/objects.a -Wl,--no-whole-archive -LE:\opencv\opencv\release2\lib -LC:\PROGRA~2\MRPT-0~1.4-3\RELEAS~1\lib -lopengl32 -lglu32 -lole32 -luuid -loleaut32 -lgdi32 -lwinmm -lsetupapi -lopencv_gpu231 -lopencv_contrib231 -lopencv_legacy231 -lopencv_objdetect231 -lopencv_calib3d231 -lopencv_features2d231 -lopencv_video231 -lopencv_highgui231 -lopencv_ml231 -lopencv_imgproc231 -lopencv_flann231 -lopencv_core231 E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxbase29u.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxmsw29u_core.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxmsw29u_gl.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxmsw29u_adv.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxmsw29u_aui.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxpng.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxtiff.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxjpeg.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxzlib.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxreg
exu.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxexpat.a -lopengl32 -lglu32 -lwinmm -lcomctl32 -lrpcrt4 -lwsock32 ..\..\lib\libmrpt-obs094.dll.a ..\..\lib\libmrpt-opengl094.dll.a ..\..\lib\libmrpt-base094.dll.a -lopengl32 -lglu32 -lole32 -luuid -loleaut32 -lgdi32 -lwinmm -lsetupapi -lopencv_gpu231 -lopencv_contrib231 -lopencv_legacy231 -lopencv_objdetect231 -lopencv_calib3d231 -lopencv_features2d231 -lopencv_video231 -lopencv_highgui231 -lopencv_ml231 -lopencv_imgproc231 -lopencv_flann231 -lopencv_core231 E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxbase29u.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxmsw29u_core.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxmsw29u_gl.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxmsw29u_adv.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxmsw29u_aui.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxpng.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxtiff.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxjpeg.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxzlib.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxregexu.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxexpat.a -lopengl32 -lglu32 -lole32 -luuid -loleaut32 -lgdi32 -lwinmm -lsetupapi -lopencv_gpu231 -lopencv_contrib231 -lopencv_legacy231 -lopencv_objdetect231 -lopencv_calib3d231 -lopencv_features2d231 -lopencv_video231 -lopencv_highgui231 -lopencv_ml231 -lopencv_imgproc231 -lopencv_flann231 -lopencv_core231 E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxbase29u.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxmsw29u_core.a E:\libraries\wx\
wxWidgets-2.9.1\lib\gcc_dll\libwxmsw29u_gl.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxmsw29u_adv.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxmsw29u_aui.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxpng.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxtiff.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxjpeg.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxzlib.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxregexu.a E:\libraries\wx\wxWidgets-2.9.1\lib\gcc_dll\libwxexpat.a -lcomctl32 -lrpcrt4 -lwsock32 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
Cut@Cャオト「ワキ: ..\..\lib\libmrpt-maps094.dll.a
CMakeFiles\mrpt-maps.dir/objects.a(CBeacon.cpp.obj):CBeacon.cpp:(.text+0x3db5): undefined reference to `_imp___ZN4mrpt6opengl14posePDF2openglINS_5poses9CPointPDFENS0_16CSetOfObjectsPtrEEET0_RKT_'
collect2: ld ヘXe[^X 1 ナIケオワオス
mingw32-make[2]: *** [bin/libmrpt-maps094.dll] G[ 1
mingw32-make[2]: ディレクトリ `c:/Program Files (x86)/mrpt-0.9.4-32bits/release-mingw32' から出ます
mingw32-make[1]: *** [libs/maps/CMakeFiles/mrpt-maps.dir/all] G[ 2
mingw32-make[1]: ディレクトリ `c:/Program Files (x86)/mrpt-0.9.4-32bits/release-mingw32' から出ます
mingw32-make: *** [all] G[ 2

Forums: 
jlblanco's picture

Hi Miyamoto,

First, thanks for the feedback and for the detailed report.

Sorry for the delay in answering, but both problems you found were tough ones!

1) About CWirelessPower: I've already wrote to the developer in charge of that class explaining the situation, and hopefully the next version of the class will not raise that link error.

2) The other link error was a quite complex one: It seems MinGw deals differently than MSVC with the DLL importing of template specializations... with a generic declaration declared without any export modifier. Quite a metaprogramming puzzle, but after a while I arrived at a solution. After doing some tests to verify nothing is broken I'll commit it, so you could update your local copy within a few hours and give it a try.

Please, let us know if the mrpt::opengl::posePDF2opengl() linking problem has really gone for MinGW.

Cheers,
JL