From: JonY <jo...@us...> - 2012-08-09 09:22:46
|
On 8/9/2012 16:36, Andi McClure wrote: > Hi, there is a library I work with ( http://polycode.org/ ) which many of > the other users of the library have had difficulty compiling. I have been > trying to put together a package of statically built versions of the > library along with build scripts, to assist these users. There is a > complication however, I don't have a copy of Windows. Therefore, when I > build the Windows version of the library, I build using MinGW 4.3.0 (or gcc > --version says it's 4.3.0, anyway), because this is the most recent version > of MinGW I have been able to find a binary installer of for my OS X machine > ( http://crossgcc.rts-software.org/doku.php ). I expect this means that > when I give Windows users their static library, they will have to build > against it using MinGW, because of the MSVC name mangling issue. > > However, when I actually went and built said static library, and gave it to > a tester, I ran into a second problem. My Windows tester installed Mingw > and MSYS by going to the mingw website and clicking the "Looking for the > latest version?" link at the top of > http://sourceforge.net/projects/mingw/files/ . When they ran the Makefile I > supplied them (a Makefile which has been tested and works on *my* machine), > they got an enormous number of linker errors ( > http://dl.dropbox.com/u/837167/errors.txt ), complaining of the same > missing 3 or 4 symbols over and over, things like "undefined reference to > `___gxx_personality_sj0". When I checked google for these errors, I found > many links explaining that these errors are symptomatic of trying to link > against a library built with mingw, using a different version of mingw. I > asked my tester to run gcc --version and it printed 4.7.0. > Different version here means different compiler setup. Your libraries seem to be built with SJLJ exception handling in mind, where as the upstream compiler uses DWARF-2. > I'm not sure how to proceed from here. My first impulse is to get the > tester to go back and install MinGW 4.3.0 on their machine. But we can't > figure out where to even obtain that. The sourceforge binaries repository > contains a great many files with cryptic names and it *looks* (?) like most > of the packages other than the "click here for newest version" link aren't > an installer or anything but are something like standalone binaries for > gcc. (There is this mingw-get thing but we're not sure if that can be used > to obtain a whole 4.3.0 toolchain.) > You could easily setup a cross compiler on your system, just make sure to use exactly the same GCC configure and build option with additional --build --host --target. > What I am trying to figure out is: > > 1. Is there some way, with my MinGW 4.3.0 install, I can create a library > that a user of later MinGWs (such as 4.7.0...?) can link against? Is the > problem really that you can't link across MinGW versions *at all* (I feel > like it would be surprising if this were the case), or is it just that I > need to package in a particular version of libstdc++ or something? > You can't, C++ is a fickle language if you want to use different compilers, you must have the exact library and compiler configuration for your entire build, from preprocessor down to link libraries and runtime DLLs if any. The underlying implementation is never defined by the standard. The easiest way is to just distribute in source, obviously, it might not do for all your audience. > 2. If I really must get my users to compile with MinGW 4.3.0, how can I > instruct them in getting this? Remember that my main problem is I am trying > to give directions to people who aren't really master coders or anything. > These are very specifically people who couldn't figure out how to use CMake > and therefore need me to compile the library for them. So if I'm to do this > at all, I need to be able to give them a no-brainer flow that's like-- > download this package A and run the installer, download this package B and > run the installer, download my package to this directory, open this window, > type "make". You could make a copy of your own developer environment or you could make your own mingw cross compiler as detailed above, or you could download and run the latest mingw GCC under wine to build your libraries. |