octave-maintainers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: MinGW build and FTGL library for Octave 3.1.55


From: Benjamin Lindner
Subject: Re: MinGW build and FTGL library for Octave 3.1.55
Date: Fri, 22 May 2009 22:54:06 +0200
User-agent: Thunderbird 2.0.0.18 (Windows/20081105)

Alexander Mamonov wrote:
Hello Benjamin,

Many thanks for the excellent work!
Can you please share with me the forbidden arcane knowledge of what
combination of compiler flag variables and configure options will
result in .oct files being linked dynamically to libgcc and libstdc++?
I tried different combinations of -shared, -shared-libgcc, and
--enable-shared, but the .oct files are still being linked statically.


Well it's certainly not forbidden, but thinking of it, it is not really well documented ...

So here we go:

You must distinguish between the shared libgcc and the shared libstd++.
Linking against shared libgcc is simple, provide -shared-libgcc at linking stage.

Linking against shared libstd++ is a bit more tricky. Needless to say, you will need a version of gcc which includes a shared libstd++. TDM's mingw port 4.3.0-2 does, for example. (mind the -2 !). The shared version of libstd++ is called libstd++_s, hence you must add -lstdc++_s. Mind that the default libstd++ will be added implicitly, so be careful of the order of the linker libraries. Then, you should link with --enable-auto-import. This is not mandatory, *but*, if you do not compile with -D_DLL, the externals referenced into standard c++ library will not be maked as __dllimport__, and therefore are not found in the shared library's import libaray, *unless* you link with --enable-auto-import, *and* since the static version of libstd++ is implicitly added at linker stage this will silenty use the static version of libstd++, although you might have explicitly specified -lstd++_s. So to save me the debugging pain, I always specify -D_DLL, thus shared and only shared libstd++ is used, and if there is a problem, I get a linker error.

So here is what I do:
  CXXFLAGS += -D_DLL
  LDFLAGS += -shared-libgcc
and then add
  -lstdc++_s
to the linker libraries at the proper position.

try the hello world example

#include <iostream>
int main()
{
   std::cout << "Hello World!\n";
   return 0;
}

once as
  g++ -D_DLL -shared-libgcc -s -o hello_shared.exe hello.cc -lstdc++_s
(mind the order of object files and linker libraries!)
and once as
  g++ -s -o hello_static.exe hello.cc

and (this is also possible)
  g++ -shared-libgcc -s -o hello_sharedgcc.exe hello.cc
which will link against shared libgcc but static libstd++

I get
$ ls -la hello*.*
-rw-r--r-- 1 admin Admins     82 May 22 22:37 hello.cc
-rwxr-xr-x 1 admin Admins   5120 May 22 22:38 hello_shared.exe
-rwxr-xr-x 1 admin Admins 441344 May 22 22:44 hello_sharedgcc.exe
-rwxr-xr-x 1 admin Admins 460288 May 22 22:38 hello_static.exe


Now the really tricky part comes, when you cannot specify "-shared-libgcc" because the tool you use, for example mkoctfile, does not recognize this flag (libtool doesn't either, by the way). The workaround I use here, is to specify -shared-libgcc as part of CXX's name, as in CXX="g++ -shared-libgcc"

hope this helps
benjamin


reply via email to

[Prev in Thread] Current Thread [Next in Thread]