mirror of
git://git.savannah.gnu.org/libtool.git
synced 2024-12-27 07:09:26 +08:00
a701df2d0a
of Hewlett-Packard, Compaq Tru64 and IBM AIX systems.
961 lines
37 KiB
Plaintext
961 lines
37 KiB
Plaintext
From ian@cygnus.com Tue Nov 3 23:23 EDT 1998
|
|
Received: from grande.dcc.unicamp.br (grande.dcc.unicamp.br [143.106.7.8])
|
|
by amazonas.dcc.unicamp.br (8.8.5/8.8.5) with ESMTP id XAA22373
|
|
for <oliva@amazonas.dcc.unicamp.br>; Tue, 3 Nov 1998 23:23:22 -0200 (EDT)
|
|
Received: from tweedledumb.cygnus.com (tweedledumb.cygnus.com [192.80.44.1])
|
|
by grande.dcc.unicamp.br (8.8.5/8.8.5) with ESMTP id XAA20164
|
|
for <oliva@dcc.unicamp.br>; Tue, 3 Nov 1998 23:23:18 -0200 (EDT)
|
|
Received: from subrogation.cygnus.com (subrogation.cygnus.com [192.80.44.76])
|
|
by tweedledumb.cygnus.com (8.8.5/8.8.5) with ESMTP id UAA13699;
|
|
Tue, 3 Nov 1998 20:25:28 -0500 (EST)
|
|
Received: (ian@localhost) by subrogation.cygnus.com (950413.SGI.8.6.12/8.6.4) id UAA01678; Tue, 3 Nov 1998 20:25:28 -0500
|
|
Date: Tue, 3 Nov 1998 20:25:28 -0500
|
|
Message-Id: <199811040125.UAA01678@subrogation.cygnus.com>
|
|
From: Ian Lance Taylor <ian@cygnus.com>
|
|
To: gvaughan@oranda.demon.co.uk
|
|
CC: tanner@gmx.de, oliva@dcc.unicamp.br, gord@trick.fig.org,
|
|
bug-libtool@gnu.org
|
|
In-reply-to: <363F3F85.2B31574@oranda.demon.co.uk>
|
|
(gvaughan@oranda.demon.co.uk)
|
|
Subject: Re: Inter-library dependencies in libtool
|
|
Content-Type: text
|
|
X-Content-Length: 3237
|
|
Xref: araguaia.dcc.unicamp.br libtool-cygwin32:2
|
|
Lines: 69
|
|
X-Gnus-Article-Number: 2 Wed Nov 4 01:39:12 1998
|
|
|
|
Date: Tue, 03 Nov 1998 17:38:13 +0000
|
|
From: "Gary V. Vaughan" <gvaughan@oranda.demon.co.uk>
|
|
|
|
It would seem that the dll code has bitrotted =(O| Pity. Ian, do you
|
|
have time/want to fix this, or do you want to pass the torch on?
|
|
|
|
I no longer have access to a Windows machine, nor do I have all that
|
|
much interest in the problem, so I'd say that somebody else had better
|
|
pick up the torch.
|
|
|
|
Incidentally, I believe that DJ Delorie is working on adding DLL
|
|
support directly to ld, which will mean that dlltool is no longer
|
|
required, and should make it possible to greatly simplify the win32
|
|
hacks in dlltool, perhaps even simply using the standard GNU ld code.
|
|
|
|
Shouldn't libtool notice that it is running on cygwin32 and pass the
|
|
-no-undefined option by itself? It seems to go against the raison
|
|
d'etre for libtool to force the Makefile developer to figure this out...
|
|
|
|
This kind of goes to the heart of libtool. libtool wants to present a
|
|
particular interface for using shared libraries. In order to do this,
|
|
it assumes that the system supports certain capabilities. One of
|
|
those is that the system can support undefined symbols in shared
|
|
libraries.
|
|
|
|
That means that on systems which do not permit shared libraries to
|
|
have undefined symbols--AIX and Windows--libtool doesn't really work.
|
|
|
|
The --no-undefined option is a hack which tells libtool that the
|
|
shared library has special characteristics which permit libtool to
|
|
create a shared library on AIX or Windows, or any other supported
|
|
platform.
|
|
|
|
I think the general idea is that you should use the --no-undefined
|
|
option whenever possible. If you do, you will be able to create
|
|
shared libraries on AIX and Windows. If you do not or can not, you
|
|
will not be able to create them.
|
|
|
|
libtool should not add a --no-undefined option itself. If it used
|
|
that option inappropriately, then building the shared library would
|
|
fail. Instead, libtool users should always use --no-undefined if they
|
|
can.
|
|
|
|
Of course, there are problems. For example, in the GNU binutils, I
|
|
can arrange matters such that --no-undefined will work on Windows, but
|
|
to do so I have to link various libraries together and I have to link
|
|
against special Windows system libraries. So I do that, which means
|
|
that I have to change the options I pass to libtool based on the
|
|
system.
|
|
|
|
In other words, the interface which libtool presents is deficient. It
|
|
does not successfully hide the system on which it is running, and it
|
|
forces the code which calls libtool to make adjustments.
|
|
|
|
I doubt there is any wholly acceptable solution here. The only
|
|
workable one I can see would be to effectively enhance Windows and AIX
|
|
shared libraries such that they support creating shared libraries with
|
|
undefined symbols. On Windows, this could be done by doing the link
|
|
once, checking for undefined symbols, creating little stub routines
|
|
for those symbols which track down the symbols in some other open DLL,
|
|
compiling those stubs, and linking them into the DLL. Perhaps
|
|
something similar is possible on AIX.
|
|
|
|
Of course even that will not make Windows DLLs identical to ELF shared
|
|
libraries. ELF shared libraries permit the main program to override a
|
|
symbol in the shared library, and Windows DLLs do not.
|
|
|
|
Ian
|
|
|
|
When libtool links DLLs, it strips some command line switches. It's probably
|
|
the case that this is ok for most situations. However, this potentially breaks
|
|
Mingw32 support in the Cygwin environment.
|
|
|
|
In order to get Mingw32 support in Cygwin, the compiler must be invoked with
|
|
the -mno-cygwin switch. If libtool strips this switch out during the link
|
|
process, the resulting binary will get linked with the wrong import libraries.
|
|
|
|
The following is a small example. I've edited the output a bit for
|
|
readability. When I send this email, long lines will get broken up, so it
|
|
still might be a bit difficult to read.
|
|
|
|
-------------------------
|
|
|
|
$ libtool --version
|
|
ltmain.sh (GNU libtool) 1.3.3 (1.385.2.181 1999/07/02 15:49:11)
|
|
|
|
|
|
$ cat xx.c
|
|
|
|
extern __declspec(dllexport) int func(void);
|
|
|
|
int func()
|
|
{
|
|
}
|
|
|
|
|
|
$ libtool --mode=compile gcc -mno-cygwin -c xx.c
|
|
mkdir .libs
|
|
gcc -mno-cygwin -c -DPIC xx.c -o .libs/xx.lo
|
|
mv -f .libs/xx.lo xx.o
|
|
ln -s xx.o xx.lo
|
|
|
|
$ libtool --mode=link gcc -mno-cygwin -o libxx.la xx.lo \
|
|
-version-info 0:0:0 -no-undefined -rpath /usr/local/lib
|
|
|
|
rm -fr .libs/libxx.la .libs/libxx.* .libs/libxx.*
|
|
|
|
generating symbol list for `libxx.la'
|
|
|
|
test -f .libs/libxx-0-0-0.dll-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here
|
|
\*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d <
|
|
/usr/local/bin/libtool > .libs/libxx-0-0-0.dll-ltdll.c
|
|
|
|
test -f .libs/libxx-0-0-0.dll-ltdll.o || (cd .libs && gcc -c
|
|
libxx-0-0-0.dll-ltdll.c)
|
|
|
|
dlltool --export-all --exclude-symbols
|
|
DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def
|
|
.libs/libxx-0-0-0.dll-def .libs/libxx-0-0-0.dll-ltdll.o xx.o
|
|
|
|
sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]* ; *//" < .libs/libxx-0-0-0.dll-def >
|
|
.libs/libxx.exp
|
|
|
|
echo EXPORTS > .libs/libxx-0-0-0.dll-def
|
|
|
|
_lt_hint=1; for symbol in `cat .libs/libxx.exp`; do echo " $symbol @
|
|
$_lt_hint; " >> .libs/libxx-0-0-0.dll-def; _lt_hint=`expr 1 + $_lt_hint`; done
|
|
|
|
test -f .libs/libxx-0-0-0.dll-ltdll.c || sed -e "/^# \/\* ltdll\.c starts
|
|
here\*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d <
|
|
/usr/local/bin/libtool > .libs/libxx-0-0-0.dll-ltdll.c
|
|
|
|
test -f .libs/libxx-0-0-0.dll-ltdll.o || (cd .libs && gcc -c
|
|
libxx-0-0-0.dll-ltdll.c)
|
|
|
|
|
|
gcc -Wl,--base-file,.libs/libxx-0-0-0.dll-base -Wl,--dll -nostartfiles -Wl,-e,
|
|
__cygwin_dll_entry@12 -o .libs/libxx-0-0-0.dll .libs/libxx-0-0-0.dll-ltdll.o
|
|
xx.o
|
|
|
|
dlltool --as=as --dllname libxx-0-0-0.dll --exclude-symbols
|
|
DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def
|
|
.libs/libxx-0-0-0.dll-def --base-file .libs/libxx-0-0-0.dll-base --output-exp
|
|
.libs/libxx-0-0-0.dll-exp
|
|
|
|
gcc -Wl,--base-file,.libs/libxx-0-0-0.dll-base
|
|
.libs/libxx-0-0-0.dll-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12
|
|
-o .libs/libxx-0-0-0.dll .libs/libxx-0-0-0.dll-ltdll.o xx.o
|
|
|
|
dlltool --as=as --dllname libxx-0-0-0.dll --exclude-symbols
|
|
DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def
|
|
.libs/libxx-0-0-0.dll-def --base-file .libs/libxx-0-0-0.dll-base --output-exp
|
|
.libs/libxx-0-0-0.dll-exp
|
|
|
|
gcc
|
|
.libs/libxx-0-0-0.dll-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12
|
|
-o .libs/libxx-0-0-0.dll .libs/libxx-0-0-0.dll-ltdll.o xx.o
|
|
|
|
(cd .libs && rm -f libxx.a && ln -s libxx-0-0-0.dll libxx.a)
|
|
|
|
dlltool --as=as --dllname libxx-0-0-0.dll --def
|
|
.libs/libxx-0-0-0.dll-def --output-lib .libs/libxx.a
|
|
|
|
creating libxx.la
|
|
|
|
(cd .libs && rm -f libxx.la && ln -s ../libxx.la libxx.la)
|
|
|
|
---------------
|
|
|
|
Notice how the 'gcc' lines do not contain the -mno-cygwin switch. This switch
|
|
should not get stripped.
|
|
|
|
Jon Leichter
|
|
jon@symas.com
|
|
|
|
|
|
"Gary V. Vaughan" wrote:
|
|
>
|
|
> On Wed, Aug 30, 2000 at 10:51:36AM -0400, Charles Wilson wrote:
|
|
> > No, it can't. Currently, libtool itself doesn't support *building*
|
|
> > dlls.
|
|
>
|
|
> Ouch. Yes it does. I added support around Christmas 1998, and have
|
|
> been maintaining it ever since.
|
|
|
|
Thanks for the correction.
|
|
|
|
>
|
|
> Yes it does. And provided your libraries don't trip over the stupid
|
|
> dll limitation of "to export a non-function symbol you must edit your
|
|
> sources", it works easily. Even if you do export data symbols,
|
|
> libtool woll build and link against a dll for you (even generating an
|
|
> import lib along the way).
|
|
>
|
|
> Unfortunately libtool was developed for Unix and assumes a featureful
|
|
> shared library architecture, which doesn't map very easily onto win32
|
|
> dll's.
|
|
>
|
|
> I will be able to simplify the dll build process a little when DJ's
|
|
> patches to binutils arrive in a cygwin release (did this happen in
|
|
> 1.1? I have been so busy with m4 that I only upgraded from b20.1 a few
|
|
> weeks ago).
|
|
|
|
They landed in binutils-20000625, and were finetuned/tweaked to a fairly
|
|
stable point by binutils-20000722 (the current version in /latest).
|
|
|
|
Also, there were a few additions that changed ld's default search order
|
|
for libraries:
|
|
-Bstatic -lfoo :
|
|
looks for libfoo.a
|
|
-Bdynamic -lfoo :
|
|
looks for libfoo.dll.a (default name for an import lib)
|
|
then foo.dll.a (alt. name for an import lib)
|
|
then libfoo.dll (link directly to a dll)
|
|
then foo.dll (ditto, alt. name)
|
|
finally, libfoo.a (fall back to static lib)
|
|
|
|
The spec file for gcc (as of 2.95.2-2) changed so that:
|
|
gcc -static calls 'ld -Bstatic'
|
|
gcc calls 'ld -Bdynamic'
|
|
|
|
Finally, 'gcc -shared' will build a dll, but you need to pass linker
|
|
options like '-Wl,--out-implib=libfoo.dll.a' explicitly.
|
|
|
|
FWIW, all of the (non-libtool) libraries I've dll-ized do not use
|
|
dlltool at all, and rely only on gcc (and ld, indirectly).
|
|
|
|
--Chuck
|
|
|
|
--
|
|
Want to unsubscribe from this list?
|
|
Send a message to cygwin-unsubscribe@sourceware.cygnus.com
|
|
From gary Tue Oct 3 18:51:55 2000
|
|
Return-Path: <cygwin-return-16563-gvaughan=oranda.demon.co.uk@sources.redhat.com>
|
|
Received: from pop3.mail.demon.net
|
|
by localhost with POP3 (fetchmail-5.3.4)
|
|
for gary@localhost (single-drop); Tue, 03 Oct 2000 18:51:55 +0100 (BST)
|
|
Received: from punt-2.mail.demon.net by mailstore
|
|
for gvaughan@oranda.demon.co.uk id 970581289:20:22249:24;
|
|
Tue, 03 Oct 2000 13:54:49 GMT
|
|
Received: from sourceware.cygnus.com ([205.180.83.71]) by punt-2.mail.demon.net
|
|
id aa2022220; 3 Oct 2000 13:54 GMT
|
|
Received: (qmail 29977 invoked by alias); 3 Oct 2000 13:52:38 -0000
|
|
Mailing-List: contact cygwin-help@sourceware.cygnus.com; run by ezmlm
|
|
Precedence: bulk
|
|
List-Unsubscribe: <mailto:cygwin-unsubscribe-gvaughan=oranda.demon.co.uk@sources.redhat.com>
|
|
List-Subscribe: <mailto:cygwin-subscribe@sources.redhat.com>
|
|
List-Archive: <http://sources.redhat.com/ml/cygwin/>
|
|
List-Post: <mailto:cygwin@sources.redhat.com>
|
|
List-Help: <mailto:cygwin-help@sources.redhat.com>, <http://sources.redhat.com/ml/#faqs>
|
|
Sender: cygwin-owner@sources.redhat.com
|
|
Delivered-To: mailing list cygwin@sources.redhat.com
|
|
Received: (qmail 29933 invoked from network); 3 Oct 2000 13:52:34 -0000
|
|
Received: from mumnunah.cs.mu.oz.au (203.19.244.130)
|
|
by sourceware.cygnus.com with SMTP; 3 Oct 2000 13:52:34 -0000
|
|
Received: from murlibobo.cs.mu.OZ.AU (murlibobo.cs.mu.OZ.AU [128.250.29.17]) by mumnunah.cs.mu.OZ.AU with ESMTP
|
|
id AAA23121; Wed, 4 Oct 2000 00:52:14 +1100 (EST)
|
|
Received: (from fjh@localhost) by murlibobo.cs.mu.OZ.AU (8.8.5/8.7.3) id AAA11289; Wed, 4 Oct 2000 00:52:13 +1100 (EST)
|
|
Date: Wed, 4 Oct 2000 00:52:13 +1100
|
|
From: Fergus Henderson <fjh@cs.mu.oz.au>
|
|
To: "Gary V. Vaughan" <gvv@techie.com>, cygwin@sources.redhat.com,
|
|
cgf@cygnus.com
|
|
Subject: Re: linking against shared libraries
|
|
Message-ID: <20001004005212.A9274@murlibobo.cs.mu.OZ.AU>
|
|
References: <012a01c02033$936effc0$f7c723cb@lifelesswks> <20000917010735.G606@demon.co.uk> <20000916234420.A23827@cygnus.com> <20000917122440.I606@demon.co.uk> <20000917122837.A24997@cygnus.com>
|
|
Mime-Version: 1.0
|
|
Content-Type: text/plain; charset=us-ascii
|
|
X-Mailer: Mutt 0.95.1i
|
|
In-Reply-To: <20000917122837.A24997@cygnus.com>; from Chris Faylor on Sun, Sep 17, 2000 at 12:28:37PM -0400
|
|
Status: RO
|
|
Content-Length: 2625
|
|
Lines: 51
|
|
|
|
On 17-Sep-2000, Chris Faylor <cgf@cygnus.com> wrote:
|
|
> On Sun, Sep 17, 2000 at 12:24:40PM +0100, Gary V. Vaughan wrote:
|
|
> >If you are interested, I will add an entry to my TODO list to see if I
|
|
> >can take some of the nicities from the libtldl LoadLibrary wrapper
|
|
> >code and apply them to the Cygwin LoadLibrary wrapper? (Automatic `_'
|
|
> >prefixing for example).
|
|
>
|
|
> Is this a characteristic of normal linux/UNIX dlsym?
|
|
|
|
AFAIK, Unix systems that support dlopen() don't prefix C symbol
|
|
names with `_' when compiling them to assembler in the first place,
|
|
so the issue is moot. At least this is the case on Solaris (2.7),
|
|
Linux (>= libc6), and OSF1 (3.2 ), which are the systems that
|
|
I have easily available right now. dlopen() originated on Solaris,
|
|
according to the Linux man page.
|
|
|
|
On systems such as Cygwin which do prefix C names with `_' when
|
|
compiling to assembler, whether dlopen() should prefix the name with an
|
|
underscore depends on whether the name that the user is trying to look
|
|
up is an assembly name or a C name. If it's a C name, then it's right
|
|
for dlopen() to prefix the name with an underscore, to match what the
|
|
C compiler does, but if it's an assembly name, then doing that would
|
|
be wrong. Unfortunately the interface to dlopen() provides the
|
|
dlopen() implementation with no clues as to which one the user meant.
|
|
The documentation for dlopen() says that the argument is the "symbol
|
|
name", which is ambiguous, but could be read as implying that it is
|
|
supposed to be the assembly name. However, in practice most uses of
|
|
dlopen() tend to be passing C names rather than assembler names.
|
|
|
|
Probably most uses of dlopen() are for C names, and so inserting
|
|
the prefix would work well in most cases. However, inserting the
|
|
prefix would also make it impossible to look up assember names that
|
|
don't start with underscore using dlopen().
|
|
|
|
It's a bit like the issue of text-versus-binary:
|
|
the original unix-only interface didn't need to distinguish
|
|
between the different cases (text/binary or C/asm/whatever),
|
|
but in the Windows environment, you do need to make such
|
|
distinctions. So some programs will need source modifications.
|
|
The best you can do is to choose the default carefully,
|
|
and make it easy to override the default for programs for which
|
|
the default is not appropriate.
|
|
|
|
--
|
|
Fergus Henderson <fjh@cs.mu.oz.au> | "I have always known that the pursuit
|
|
WWW: <http://www.cs.mu.oz.au/~fjh> | of excellence is a lethal habit"
|
|
PGP: finger fjh@128.250.37.3 | -- the last words of T. S. Garp.
|
|
|
|
--
|
|
Want to unsubscribe from this list?
|
|
Send a message to cygwin-unsubscribe@sourceware.cygnus.com
|
|
|
|
On Sun, Sep 03, 2000 at 01:34:23AM -0400, Charles Wilson wrote:
|
|
> "Gary V. Vaughan" wrote:
|
|
>
|
|
> > > Now, suppose that the png folks release a newer version, say png-2.1.x
|
|
> > > that exposes some additional features, but is backwards compatible with
|
|
> > > png-2.0.x. Great. You build it, but create:
|
|
> > >
|
|
> > > libpng31.dll.a (embeds the name libpng31.dll.a)
|
|
> > > libpng.dll.a -> libpng31.dll.a
|
|
> > > libpng3.dll (replaces the old version (*))
|
|
> >
|
|
> > I don't think we need anything more than
|
|
> >
|
|
> > a replacement libpng3.dll
|
|
>
|
|
> Not so. Remember, libpng-2.1.x can include additional functions that
|
|
> were not included by libpng-2.0.x, as long as it includes all of the
|
|
> 'old' functions/vars without modification. So, you need to update the
|
|
> import lib as well as the dll, so that new packages that use the
|
|
> additional functions will work.
|
|
|
|
Oops. I hadn't thought of that. Good point.
|
|
|
|
> > Otherwise we are still in violent agreement.
|
|
>
|
|
> I agree.
|
|
|
|
=)O|
|
|
|
|
> > > > Maybe Cygwin should put all of it's libtool built libraries (or any
|
|
> > > > others that are correctly versioned w.r.t the runtime loader) into a
|
|
> > > > single directory that is near the front of the default path. /usr/lib
|
|
> > > > seems like a good place.
|
|
> > >
|
|
> > > That's part of my 'easy' solution above. It may fix the cygwin problem,
|
|
> > > but the requirement is not nice to native apps or other unix-on-win
|
|
> > > emulations that the user may have.
|
|
> > >
|
|
> > > Relying on 'get dll's from same dir as .exe' works -- but only if EVERY
|
|
> > > cygwin exe and EVERY cygwin dll are piled into the same dir.
|
|
> >
|
|
> > Can't we assume that the native dll's we rely on are outside cygwin's
|
|
> > control and can be relied upon to be managed by the operating system
|
|
> > (I'm thinking of stuff in the SYSTEM directory), and that non-cygwin
|
|
> > libraries (such as Pauls pw dlls) will not be installed into the
|
|
> > cygwin binary search path? In which case I think it is okay to
|
|
> > install all cygwin dlls and import libs to /usr/lib, making sure that
|
|
> > cygwin.bat (or any other cygwin startup methods) put /usr/lib first in
|
|
> > $PATH.
|
|
>
|
|
> this works for the 'sandbox user' -- Michael Ring's 'user 1' in this
|
|
> message:
|
|
> http://sources.redhat.com/ml/cygwin/2000-08/msg01241.html
|
|
>
|
|
> It doesn't work for Michael's 'user 2' -- the guy who normally runs in
|
|
> cmd.exe/command.com, but relies on cygwin commands every once in a
|
|
> while. He doesn't use bash, but likes the cygwin-perl or grep every
|
|
> once and a while. User 2 will have the cygwin directories somewhere in
|
|
> her path -- but not necessarily first.
|
|
|
|
We could tell these people to put C:/cygwin/usr/bin at the front of
|
|
their PATH...
|
|
|
|
> > Does cygwin ld use -rpath yet?
|
|
>
|
|
> I don't think so. -rpath is something that ld.so uses; Windows doesn't
|
|
> have ld.so. Windows *always* loads dll's according to the following
|
|
> search order:
|
|
> current directory
|
|
> app's load directory
|
|
> global executable search path
|
|
>
|
|
> The only two exceptions I know of are:
|
|
>
|
|
> 1) In Win2K, if there is a file called 'app.exe.local' in the same
|
|
> directory as app.exe, then all dll's will be loaded from the app's load
|
|
> directory -- even if explicitly dlopened() with an absolute path that
|
|
> points elsewhere. the .local. may also override the 'current directory'
|
|
> part of the search order listed above, but I'm not sure.
|
|
|
|
Holy cr@p! What happened to simplicity? If Bill has decided that he
|
|
can't understand how to write a decent shared library system, and
|
|
want's to relegate dll's to LoadLibrary() objects, why doesn't he just
|
|
say so? Wouldn't it be easier to statically link a Win2k program that
|
|
twiddle about with all this .local mess?
|
|
|
|
> 2) You can put something called 'AppPath' in the registry, which will
|
|
> influence the directories that are searched. I don't know where in the
|
|
> list above that the directories listed in the 'AppPath' key are
|
|
> inserted.
|
|
|
|
This sounds promising. I'll see if I can find any details on it.
|
|
|
|
> > I am prepared to work on having libtool do the right thing as far
|
|
> > as possible.
|
|
>
|
|
> What was the right thing, again? :-)
|
|
|
|
Based on our conversation so far:
|
|
|
|
* When building a libtool (.la) library, create libfoo.la,
|
|
libfoo<iface>.dll, libfoo.dll.a and libfoo.a, where:
|
|
- <iface> is the earliest fully supported interface number
|
|
- libfoo.dll.a is the import library for libfoo<iface>.dll
|
|
|
|
* When installing a libtool (.la) library:
|
|
- libfoo.la goes to $prefix/lib
|
|
- libfoo<iface>.dll goes to $prefix/bin
|
|
- libfoo.dll.a goes to $prefix/lib
|
|
- libfoo.a goes to $prefix/lib
|
|
|
|
* When linking against libfoo.la
|
|
- use libfoo.dll.a unless -static or -all-static
|
|
- otherwise use libfoo.a
|
|
|
|
* When linking against -lfoo
|
|
- if libfoo.la is found, behave as above
|
|
- else let ld (or gcc) do its thing
|
|
|
|
Which is especially cool, because I don't think I need to worry about
|
|
dealing with direct linkage to dlls (I can just punt and let gcc/ld do
|
|
the hard work) which removes a whole pile of spaghetti where I had to
|
|
cope with compiling the impgen code correctly in cross compilation
|
|
environments!
|
|
|
|
> > By default libtool always searches for a dll to link against and
|
|
> > generates the implib on the fly if a suitable one is found.
|
|
|
|
This won't be necessary under the new scheme =)O|
|
|
|
|
> There are occaisions where you want to link to an import lib in
|
|
> preference to a dll -- for instance, libcygwin.a is an import lib, but
|
|
> contains initializer code and actual function implementations for some
|
|
> functions that are not included in the dll itself. If you attempt to
|
|
> link directly to cygwin1.dll, the link fails because those things are
|
|
> missing from the virtual on-the-fly implib.
|
|
|
|
I didn't know about that. Thanks.
|
|
|
|
> But where do you put the dll? It has to go into the executable PATH so
|
|
> that the windows loader can find it. Do you copy it into /usr/lib, so
|
|
> that the default ld search path will find it? Do you add /usr/bin to
|
|
> the linktime library search path (-L/usr/bin)? Perhaps a symlink in
|
|
> /usr/lib, pointing to /usr/bin/libfoo.dll is all you need.
|
|
>
|
|
> However!!! Ld uses the following library name search order when hunting
|
|
> for -lfoo:
|
|
>
|
|
> libfoo.dll.a
|
|
> foo.dll.a
|
|
> libfoo.a <<<< NOTE!!
|
|
> libfoo.dll
|
|
> foo.dll
|
|
|
|
Or that. Thanks again! Libtool already provides --disable-static if
|
|
the user wants to build and install only the dll parts of the library.
|
|
|
|
For this to work (that is, in order for me to be able to punt to gcc/ld
|
|
in the majority of cases) I must generate dll names that will be
|
|
found, so the cygfoo.dll idea is out (Sorry Paul!).
|
|
|
|
Although this doesn't help ``User 2'' very much, he is no worse off
|
|
than before if I change libtool's behaviour in this way. Here's a
|
|
thought: For each dll using application linked, I could have libtool
|
|
install a .bat script to C:/cygwin/launch (or similar) which would set
|
|
the PATH environment correctly for that application. As long as
|
|
``User 2'' has the launch directory higher in his PATH than the actual
|
|
binary directory, this would guarantee correct dll selection.
|
|
|
|
This would give ``User 1'' many of the advantages shared libraries
|
|
offer on Unix, without sinking into DLL Hell. Assuming that everyone
|
|
buys into it. The only reason shared libraries work properly on Unix
|
|
is that everyone has to agree to conform to the runtime loader's
|
|
versioning scheme -- so don't give some excuse about ``if we don't
|
|
want to change the core cygwin dll's to conform this won't work''. On
|
|
my linux box, I can move my libc around or drop several incompatible
|
|
versions of libc into my filesystem, and my applications will stop
|
|
loading the intended libraries too. No surprises there!
|
|
|
|
Cheers,
|
|
Gary.
|
|
--
|
|
___ _ ___ __ _ mailto: gvv@techie.com
|
|
/ __|__ _ _ ___ _| | / / | / /_ _ _ _ __ _| |_ __ _ ___ gary@gnu.org
|
|
| (_ / _` | '_|// / |/ /| |/ / _` | || / _` | ' \/ _` | _ \
|
|
\___\__,_|_|\_, /|___(_)___/\__,_|\_,_\__, |_||_\__,_|//_/
|
|
home page: /___/ /___/ gpg public key:
|
|
http://www.oranda.demon.co.uk http://www.oranda.demon.co.uk/key.asc
|
|
|
|
--
|
|
Want to unsubscribe from this list?
|
|
Send a message to cygwin-unsubscribe@sourceware.cygnus.com
|
|
On Sun, Sep 03, 2000 at 04:39:51PM -0300, Alexandre Oliva wrote:
|
|
> On Sep 3, 2000, "Gary V. Vaughan" <gvv@techie.com> wrote:
|
|
>
|
|
> > * When installing a libtool (.la) library:
|
|
> > - libfoo.la goes to $prefix/lib
|
|
> > - libfoo<iface>.dll goes to $prefix/bin
|
|
> > - libfoo.dll.a goes to $prefix/lib
|
|
> > - libfoo.a goes to $prefix/lib
|
|
>
|
|
> Nope. libfoo.la goes wherever -rpath specified when the library was
|
|
> created; it should be the same directory that is specified at install
|
|
> time. This is often $(libdir), but it doesn't have to be.
|
|
>
|
|
> I don't know how to arrange for an additional directory (bindir) to
|
|
> be specifiable without introducing an additional command-line option.
|
|
> Remember, libtool doesn't know about prefix, libdir or bindir, it just
|
|
> knows about what it's given in the command line.
|
|
|
|
Hmm. I hadn't thought of that. Still, at least the principle of the
|
|
thing is right now, I think...
|
|
|
|
Cheers,
|
|
Gary.
|
|
--
|
|
___ _ ___ __ _ mailto: gvv@techie.com
|
|
/ __|__ _ _ ___ _| | / / | / /_ _ _ _ __ _| |_ __ _ ___ gary@gnu.org
|
|
| (_ / _` | '_|// / |/ /| |/ / _` | || / _` | ' \/ _` | _ \
|
|
\___\__,_|_|\_, /|___(_)___/\__,_|\_,_\__, |_||_\__,_|//_/
|
|
home page: /___/ /___/ gpg public key:
|
|
http://www.oranda.demon.co.uk http://www.oranda.demon.co.uk/key.asc
|
|
|
|
There's an easier way -- one command! 'gcc -shared' will create a dll
|
|
for you. Just do:
|
|
|
|
$(BASE)=foo
|
|
|
|
gcc -shared -o cyg$(BASE).dll -Wl,--out-implib=lib$(BASE).dll.a \
|
|
-Wl,--export-all -Wl,--enable-auto-image-base \
|
|
-Wl,--output-def=cyg$(BASE).def $(OBJS)
|
|
|
|
Grab any of the packages in the 'contrib' directory and look an the
|
|
makefiles (you might need to do a minimal 'configure' first, to
|
|
customize the Makefile for cygwin before using it as a model)
|
|
|
|
--Chuck
|
|
|
|
Jrgen Schuck wrote:
|
|
>
|
|
> I'm not sure about the kind of object that 'gcc -shared'
|
|
> produces. But I think it won't be what you might expect.
|
|
> In Windows shared sobjects are DLL's. You probably will
|
|
> have to convert your Makefiles to cproduce DLL's instead
|
|
> of UNIX-style .so files.
|
|
>
|
|
> I did the same task when porting a TCL-extension from
|
|
> UNIX to Cygwin. The Makefile (SVR4) changes from
|
|
>
|
|
> libTclDM20.so:
|
|
> ld -G -o $@ $(OBJS)
|
|
>
|
|
> to
|
|
>
|
|
> LOAD = TclDM20
|
|
> DEF = $(LOAD).def
|
|
> BAS = $(LOAD).base
|
|
> EXP = $(LOAD).exp
|
|
> $(DLL): $(OBJS)
|
|
> echo EXPORTS >$(DEF)
|
|
> nm $+ | grep '^........ [T] _' | sed 's/[^_]*_//' >>$(DEF)
|
|
> $(LD) --base-file $(BAS) -dll -o $@ $+ -e _dll_entry@12 \
|
|
> -L`dirname \`gcc -print-file-name=libgcc.a\`` \
|
|
> $(LIBS) -lgcc -lcygwin -lkernel32 -lgcc
|
|
> dlltool --as=as -dllname $@ --def $(DEF) \
|
|
> --base-file $(BAS) --output-exp $(EXP)
|
|
> $(LD) --base-file $(BAS) $(EXP) -dll -o $@ $+ -e _dll_entry@12 \
|
|
> -L`dirname \`gcc -print-file-name=libgcc.a\`` \
|
|
> $(LIBS) -lgcc -lcygwin -lkernel32 -lgcc
|
|
> dlltool --as=as -dllname $@ --def $(DEF) \
|
|
> --base-file $(BAS) --output-exp $(EXP)
|
|
> $(LD) $(EXP) -dll -o $@ $+ -e _dll_entry@12 \
|
|
> -L`dirname \`gcc -print-file-name=libgcc.a\`` \
|
|
> $(LIBS) -lgcc -lcygwin -lkernel32 -lgcc
|
|
>
|
|
> For further information see
|
|
> http://sources.redhat.com/cygwin/docs.html,
|
|
> section "Writing DLLs". Reading these docs you
|
|
> will find two further modules: dll_init.c and
|
|
> dll_fixup.c. I didn't put them into my DLL because
|
|
> the resulting DLL crashes the TCL-interpreter.
|
|
>
|
|
> Furthermore I found it very helpful to take a
|
|
> look into the Makefiles of the DLL-generating
|
|
> packages of the Cygwin-distribution: tcl, wish
|
|
> and tix.
|
|
>
|
|
> Jrgen Schuck
|
|
> PCM-Kundenbetreuung
|
|
> Business Unit Information
|
|
> _________________________________________________
|
|
> MATERNA GmbH Information & Communications
|
|
> Vosskuhle 37 * 44141 Dortmund
|
|
> Tel.: 0231 - 5599 - 191 * Fax: -272
|
|
> Handy: 0172 - 23 70 148 * http://www.materna.de
|
|
>
|
|
> --
|
|
> Want to unsubscribe from this list?
|
|
> Send a message to cygwin-unsubscribe@sourceware.cygnus.com
|
|
|
|
--
|
|
Want to unsubscribe from this list?
|
|
Send a message to cygwin-unsubscribe@sourceware.cygnus.com
|
|
From gary Tue Oct 10 18:50:22 2000
|
|
Return-Path: <cygwin-return-16847-gvaughan=oranda.demon.co.uk@sources.redhat.com>
|
|
Received: from pop3.mail.demon.net
|
|
by localhost with POP3 (fetchmail-5.3.4)
|
|
for gary@localhost (single-drop); Tue, 10 Oct 2000 18:50:22 +0100 (BST)
|
|
Received: from punt-2.mail.demon.net by mailstore
|
|
for gvaughan@oranda.demon.co.uk id 971135226:20:06380:2;
|
|
Mon, 09 Oct 2000 23:47:06 GMT
|
|
Received: from sourceware.cygnus.com ([205.180.83.71]) by punt-2.mail.demon.net
|
|
id aa2005552; 9 Oct 2000 23:46 GMT
|
|
Received: (qmail 16236 invoked by alias); 9 Oct 2000 23:46:45 -0000
|
|
Mailing-List: contact cygwin-help@sourceware.cygnus.com; run by ezmlm
|
|
Precedence: bulk
|
|
List-Unsubscribe: <mailto:cygwin-unsubscribe-gvaughan=oranda.demon.co.uk@sources.redhat.com>
|
|
List-Subscribe: <mailto:cygwin-subscribe@sources.redhat.com>
|
|
List-Archive: <http://sources.redhat.com/ml/cygwin/>
|
|
List-Post: <mailto:cygwin@sources.redhat.com>
|
|
List-Help: <mailto:cygwin-help@sources.redhat.com>, <http://sources.redhat.com/ml/#faqs>
|
|
Sender: cygwin-owner@sources.redhat.com
|
|
Delivered-To: mailing list cygwin@sources.redhat.com
|
|
Received: (qmail 16211 invoked from network); 9 Oct 2000 23:46:43 -0000
|
|
Received: from mail.ee.gatech.edu (130.207.230.10)
|
|
by sourceware.cygnus.com with SMTP; 9 Oct 2000 23:46:43 -0000
|
|
Received: from ece.gatech.edu (s02-pm03.gatech.campuscwix.net [168.14.1.69])
|
|
by mail.ee.gatech.edu (8.11.0/8.11.0) with ESMTP id e99NkTO15440;
|
|
Mon, 9 Oct 2000 19:46:30 -0400 (EDT)
|
|
Message-ID: <39E259A7.CBAD325F@ece.gatech.edu>
|
|
Date: Mon, 09 Oct 2000 19:49:59 -0400
|
|
From: Charles Wilson <cwilson@ece.gatech.edu>
|
|
X-Mailer: Mozilla 4.75 [en] (Windows NT 5.0; U)
|
|
X-Accept-Language: en
|
|
MIME-Version: 1.0
|
|
To: cygwin@sourceware.cygnus.com
|
|
Subject: Re: AW: Linking Dynamic Libraries
|
|
References: <004501c031f0$10478ad0$0d33028b@zapperlot.materna.de> <39E1CC08.F475851F@ece.gatech.edu> <39E2468B.BFDD3AB7@ihug.co.nz>
|
|
Content-Type: text/plain; charset=us-ascii
|
|
Content-Transfer-Encoding: 7bit
|
|
Status: RO
|
|
Content-Length: 5252
|
|
Lines: 189
|
|
|
|
You still need to worry about things like __declspec(dllexport) and
|
|
__declspec(dllimport). Here's a patch for your files.
|
|
|
|
(Yes, you are correct; the option is '--export-all-symbols' not
|
|
'--export-all')
|
|
|
|
As far as documentation, there's the mailing list, and 'ld --help' and
|
|
Mumit's (really out-of-date) dll-helpers packaqe at
|
|
http://www.xraylith.wisc.edu/~khan/software/gnu-win32/dllhelpers.html.
|
|
Would you like to update that package for the current capabilities of
|
|
ld/gcc ? Mumit's tutorial is heavily 'dlltool' based, rather than 'gcc
|
|
-shared' or 'ld' based.
|
|
|
|
NOTE 1: I had to remove "-Wl,--export-all-symbols" from the options;
|
|
with export-all I got a stack dump even with my other changes. I'm not
|
|
sure why.
|
|
|
|
NOTE 2: I used the extension '.dll.a' for the import library; cygwin's
|
|
linker will search for 'libfoo.dll.a' in preference to 'libfoo.a';
|
|
libfoo.a is assumed to be a static library (although the linker will use
|
|
libfoo.a if .dll.a is not found)
|
|
|
|
--Chuck
|
|
|
|
|
|
diff -u demo-orig/Makefile demo/Makefile
|
|
--- demo-orig/Makefile Mon Oct 9 19:34:15 2000
|
|
+++ demo/Makefile Mon Oct 9 19:45:10 2000
|
|
@@ -3,7 +3,7 @@
|
|
EXENAME = demo
|
|
EXEOBJ = demo.o
|
|
CPLUS = g++ -W -Wall -Werror
|
|
-LINKDLL = g++ -shared -Wl,--export-all -Wl,--enable-auto-image-base
|
|
+LINKDLL = g++ -shared -Wl,--enable-auto-image-base
|
|
LINKEXE = g++ -L.
|
|
|
|
.DELETE_ON_ERROR:
|
|
@@ -13,13 +13,16 @@
|
|
all: $(DLLNAME).dll $(EXENAME)
|
|
|
|
clean:
|
|
- rm -f $(DLLOBJ) $(DLLNAME).dll lib$(DLLNAME).a $(EXEOBJ)
|
|
$(EXENAME).exe
|
|
+ rm -f $(DLLOBJ) $(DLLNAME).dll lib$(DLLNAME).dll.a $(EXEOBJ)
|
|
$(EXENAME).exe
|
|
|
|
%.o: %.cpp
|
|
$(CPLUS) -c $< -o $@
|
|
|
|
+$(DLLOBJ): $(DLLOBJ:.o=.cpp)
|
|
+ $(CPLUS) -DBUILD_DLL -c $< -o $@
|
|
+
|
|
$(DLLNAME).dll: $(DLLOBJ)
|
|
- $(LINKDLL) $(DLLOBJ) -o $(DLLNAME).dll
|
|
-Wl,--out-implib=lib$(DLLNAME).a
|
|
+ $(LINKDLL) $(DLLOBJ) -o $(DLLNAME).dll
|
|
-Wl,--out-implib=lib$(DLLNAME).dll.a
|
|
|
|
$(EXENAME): $(EXEOBJ) $(DLLNAME).dll
|
|
$(LINKEXE) $(EXEOBJ) -l$(DLLNAME) -o $(EXENAME)
|
|
diff -u demo-orig/foo.hpp demo/foo.hpp
|
|
--- demo-orig/foo.hpp Mon Oct 9 19:35:58 2000
|
|
+++ demo/foo.hpp Mon Oct 9 19:35:50 2000
|
|
@@ -3,7 +3,12 @@
|
|
|
|
#include <string>
|
|
|
|
-extern std::string global_mangle(const std::string& source);
|
|
-
|
|
+#ifdef BUILD_DLL
|
|
+#define FOO_EXPORT __declspec(dllexport)
|
|
+#else
|
|
+#define FOO_EXPORT __declspec(dllimport)
|
|
#endif
|
|
|
|
+extern FOO_EXPORT std::string global_mangle(const std::string& source);
|
|
+
|
|
+#endif
|
|
|
|
Ross Smith wrote:
|
|
>
|
|
> "Charles S. Wilson" wrote:
|
|
> >
|
|
> > There's an easier way -- one command! 'gcc -shared' will create a dll
|
|
> > for you. Just do:
|
|
> >
|
|
> > $(BASE)=foo
|
|
> >
|
|
> > gcc -shared -o cyg$(BASE).dll -Wl,--out-implib=lib$(BASE).dll.a \
|
|
> > -Wl,--export-all -Wl,--enable-auto-image-base \
|
|
> > -Wl,--output-def=cyg$(BASE).def $(OBJS)
|
|
>
|
|
> I can't get this to work. Whenever I link with the import lib produced
|
|
> this way, the resulting program crashes with a STATUS_ACCESS_VIOLATION.
|
|
> (See attached code.) I don't even need to call any of the DLL functions
|
|
> to trigger it -- just linking with -lfoo makes it unworkable. What am I
|
|
> doing wrong?
|
|
>
|
|
> And where is all this stuff documented anyway? The ld docs mention
|
|
> --export-all-symbols (not --export-all), but not any of the others.
|
|
>
|
|
> -------------------- cut here --------------------
|
|
>
|
|
> // demo.cpp
|
|
>
|
|
> #include "foo.hpp"
|
|
> #include <iostream>
|
|
> #include <string>
|
|
>
|
|
> int main() {
|
|
> std::string thing("thing");
|
|
> std::cout << thing << std::endl;
|
|
> // std::cout << global_mangle(thing) << std::endl;
|
|
> return 0;
|
|
> }
|
|
>
|
|
> -------------------- cut here --------------------
|
|
>
|
|
> // foo.hpp
|
|
>
|
|
> #ifndef FOO_HEADER
|
|
> #define FOO_HEADER
|
|
>
|
|
> #include <string>
|
|
>
|
|
> extern std::string global_mangle(const std::string& source);
|
|
>
|
|
> #endif
|
|
>
|
|
> -------------------- cut here --------------------
|
|
>
|
|
> // foo.cpp
|
|
>
|
|
> #include "foo.hpp"
|
|
>
|
|
> std::string global_mangle(const std::string& source) {
|
|
> return source + "_global";
|
|
> }
|
|
>
|
|
> -------------------- cut here --------------------
|
|
>
|
|
> // Makefile
|
|
>
|
|
> DLLNAME = foo
|
|
> DLLOBJ = foo.o
|
|
> EXENAME = demo
|
|
> EXEOBJ = demo.o
|
|
> CPLUS = g++ -W -Wall -Werror
|
|
> LINKDLL = g++ -shared -Wl,--export-all -Wl,--enable-auto-image-base
|
|
> LINKEXE = g++ -L.
|
|
>
|
|
> .DELETE_ON_ERROR:
|
|
>
|
|
> .PHONY: all clean
|
|
>
|
|
> all: $(DLLNAME).dll $(EXENAME)
|
|
>
|
|
> clean:
|
|
> rm -f $(DLLOBJ) $(DLLNAME).dll lib$(DLLNAME).a $(EXEOBJ)
|
|
> $(EXENAME).exe
|
|
>
|
|
> %.o: %.cpp
|
|
> $(CPLUS) -c $< -o $@
|
|
>
|
|
> $(DLLNAME).dll: $(DLLOBJ)
|
|
> $(LINKDLL) $(DLLOBJ) -o $(DLLNAME).dll
|
|
> -Wl,--out-implib=lib$(DLLNAME).a
|
|
>
|
|
> $(EXENAME): $(EXEOBJ) $(DLLNAME).dll
|
|
> $(LINKEXE) $(EXEOBJ) -l$(DLLNAME) -o $(EXENAME)
|
|
>
|
|
> demo.o: demo.cpp foo.hpp
|
|
> foo.o: foo.cpp foo.hpp
|
|
>
|
|
> -------------------- cut here --------------------
|
|
>
|
|
> --
|
|
> Ross Smith <ross.s@ihug.co.nz> The Internet Group, Auckland, New Zealand
|
|
> ========================================================================
|
|
> "C++ is to programming as sex is to reproduction. Better ways might
|
|
> technically exist but they're not nearly as much fun." -- Nikolai Irgens
|
|
>
|
|
> --
|
|
> Want to unsubscribe from this list?
|
|
> Send a message to cygwin-unsubscribe@sourceware.cygnus.com
|
|
|
|
--
|
|
Want to unsubscribe from this list?
|
|
Send a message to cygwin-unsubscribe@sourceware.cygnus.com
|
|
|
|
From gary Wed Oct 11 18:38:50 2000
|
|
Return-Path: <cygwin-return-16974-gvaughan=oranda.demon.co.uk@sources.redhat.com>
|
|
Received: from pop3.mail.demon.net
|
|
by localhost with POP3 (fetchmail-5.3.4)
|
|
for gary@localhost (single-drop); Wed, 11 Oct 2000 18:38:50 +0100 (BST)
|
|
Received: from punt-1.mail.demon.net by mailstore
|
|
for gvaughan@oranda.demon.co.uk id 971256552:10:18423:4;
|
|
Wed, 11 Oct 2000 09:29:12 GMT
|
|
Received: from sourceware.cygnus.com ([205.180.83.71]) by punt-1.mail.demon.net
|
|
id aa1018296; 11 Oct 2000 9:29 GMT
|
|
Received: (qmail 10937 invoked by alias); 11 Oct 2000 09:28:33 -0000
|
|
Mailing-List: contact cygwin-help@sourceware.cygnus.com; run by ezmlm
|
|
Precedence: bulk
|
|
List-Unsubscribe: <mailto:cygwin-unsubscribe-gvaughan=oranda.demon.co.uk@sources.redhat.com>
|
|
List-Subscribe: <mailto:cygwin-subscribe@sources.redhat.com>
|
|
List-Archive: <http://sources.redhat.com/ml/cygwin/>
|
|
List-Post: <mailto:cygwin@sources.redhat.com>
|
|
List-Help: <mailto:cygwin-help@sources.redhat.com>, <http://sources.redhat.com/ml/#faqs>
|
|
Sender: cygwin-owner@sources.redhat.com
|
|
Delivered-To: mailing list cygwin@sources.redhat.com
|
|
Received: (qmail 10909 invoked from network); 11 Oct 2000 09:28:30 -0000
|
|
Received: from web6405.mail.yahoo.com (128.11.22.153)
|
|
by sourceware.cygnus.com with SMTP; 11 Oct 2000 09:28:30 -0000
|
|
Message-ID: <20001011092829.19377.qmail@web6405.mail.yahoo.com>
|
|
Received: from [203.97.2.247] by web6405.mail.yahoo.com; Wed, 11 Oct 2000 22:28:29 NZDT
|
|
Date: Wed, 11 Oct 2000 22:28:29 +1300 (NZDT)
|
|
From: =?iso-8859-1?q?Danny=20Smith?= <danny_r_smith_2001@yahoo.co.nz>
|
|
Subject: Re: AW: Linking Dynamic Libraries
|
|
To: cygwin@sources.redhat.com
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=iso-8859-1
|
|
Content-Transfer-Encoding: 8bit
|
|
Status: RO
|
|
Content-Length: 1133
|
|
Lines: 38
|
|
|
|
Ross Smith wrote:
|
|
>
|
|
> Charles Wilson wrote:
|
|
> >
|
|
> > You still need to worry about things like __declspec(dllexport) and
|
|
> > __declspec(dllimport).
|
|
>
|
|
> What's the point of --export-all-symbols then? I was under the
|
|
> impression that it was intended to duplicate the Unix convention,
|
|
where
|
|
> all external symbols are automatically exported from a .so.
|
|
(Actually,
|
|
> the help refers to "global" symbols, not "external", but I assumed
|
|
that
|
|
> just meant that whoever wrote the help didn't know C++.)
|
|
|
|
|
|
If you really want to --export-all in C++, this is a workaround.
|
|
Create a def with dlltool:
|
|
dlltool --export-all --output-def foo_.def --dllname foo.dll *.o
|
|
|
|
Then look at the def file. Do you still really want to export-all?
|
|
|
|
To use that def file with ld -shared you need to get rid of the
|
|
comments (demangled names)
|
|
cut does the job:
|
|
cut -d ';' -f 1 foo_.def >foo.def
|
|
|
|
Cheers
|
|
|
|
|
|
_____________________________________________________________________________
|
|
http://clubs.yahoo.com.au - Yahoo! Clubs
|
|
- Join a club or build your own!
|
|
|
|
--
|
|
Want to unsubscribe from this list?
|
|
Send a message to cygwin-unsubscribe@sourceware.cygnus.com
|
|
|