This is the mail archive of the cygwin mailing list for the Cygwin project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Linking shared libraries problem

Larry Hall (Cygwin) wrote:
On 8/29/2010 7:08 PM, TomÃs Staig wrote:
I have been trying to port some software from Linux (Scientific Linux/RedHat)
to windows using Cygwin. I have been able to port most of it with little
changes but I encountered a problem when linking shared libraries. It seems
that the chain of dependencies is not included when linking. Furthermore, ldd
does not show the dependency libraries as in Linux. I have tried both using
the import libraries (%.dll.a) and linking the dll files (%.dll) directly.

I have arranged a small example program that reproduces this effect.
Used Ubuntu 8.04 to and "CYGWIN_NT-5.1" version "1.7.6(0.230/5/3) 2010-08-16
16:06" on top of a 32-bits Windows XP Machine to test the above examples.


As you can see, there is no reference to liby.dll. I could add the library
(-ly) directly to the compiling line of main and it works, but the truth is
that it would not be a good approach, since in the software I'm trying to
port, there are several dependent modules, so the last ones would have an
incredibly large list of dependencies.

So, am I doing something wrong? Is there any way to add the dependency to be
shown with ldd or any workaround(maybe a linker flag or something) to make
the above example work?

The Windows loader requires full resolution at link time. You need to list
at least the import libraries for all dependencies if you want the link
to succeed. Sorry, that's just the way Windows works.

Thanks for your reply. I have found a workaround, however.
Probably not the best thing to do in general, but for my case it is pretty useful:

Makefile in Cygwin:
g++ -c x.cpp
g++ -c y.cpp
g++ -shared -Wl,--output-def,liby.def -Wl,-out-implib=liby.dll.a -Wl,-export-all-symbols -Wl,-enable-auto-import -Wl,-whole-archive y.o -Wl,-no-whole-archive -o liby.dll
g++ -shared -Wl,-out-implib=libx.dll.a -Wl,-export-all-symbols -Wl,-enable-auto-import -Wl,-whole-archive x.o liby.def -Wl,-no-whole-archive -L./ -ly -o libx.dll
g++ -o main main.cpp -L./ -lx

If anyone is going to use this, be aware that it might get you "multiple definition" problems. I still haven't checked how this behaves in the project I'm porting, but in this tiny example it works flawlessly.

Problem reports:
Unsubscribe info:

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]