Re: Linking shared libraries problem

2010-08-31 Thread Tomas Staig

Larry Hall (Cygwin) wrote:

On 8/29/2010 7:08 PM, Tomás Staig wrote:

Hi,
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.


snip

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:
all:
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:   http://cygwin.com/problems.html
FAQ:   http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info:  http://cygwin.com/ml/#unsubscribe-simple



Linking shared libraries problem

2010-08-29 Thread Tomás Staig

 Hi,
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.


x.h:
int add(int a, int b);

x.cpp:
#include x.h
int add(int a, int b) {return a + b;}

y.h:
int sub(int a, int b);

y.cpp:
#include y.h
int sub(int a, int b){return a - b;}

main.cpp:
#include stdio.h
#include x.h
#include y.h

int main()
{
   printf(%d\n,add(1,1));
   printf(%d\n,sub(2,1));
   return 0;
}

Makfile in Linux:
#Compiling
all:
   g++ -c x.cpp
   g++ -c y.cpp
   g++ -shared -Wl,-whole-archive y.o -Wl,-no-whole-archive -o liby.so
   g++ -shared -Wl,-whole-archive x.o -Wl,-no-whole-archive -L./ -ly -o 
libx.so

   g++ -o main main.cpp -L./ -lx

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

   g++ -o main main.cpp -L./ -lx

Linux does not produce any output and the program 'main' works.
Cygwin Output:
/tmp/cc0LNesq.o:main.cpp:(.text+0x4a): undefined reference to `sub(int, 
int)'

collect2: ld returned 1 exit status
make: *** [all] Error 1

If I use ldd in Linux for libx.so:
$ ldd libx.so
linux-gate.so.1 =  (0xb772f000)
liby.so (0xb7729000)
libstdc++.so.6 = /usr/lib/libstdc++.so.6 (0xb7635000)
libm.so.6 = /lib/tls/i686/cmov/libm.so.6 (0xb75f9000)
libgcc_s.so.1 = /lib/libgcc_s.so.1 (0xb75ee000)
libc.so.6 = /lib/tls/i686/cmov/libc.so.6 (0xb749f000)
/lib/ld-linux.so.2 (0xb773)

and in Cygwin for libx.dll:
$ ldd libx.dll
ntdll.dll = /cygdrive/c/WINDOWS/system32/ntdll.dll (0x7c91)
kernel32.dll = /cygdrive/c/WINDOWS/system32/kernel32.dll (0x7c80)

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?

Thanks in advance.

Best Regards,
Tomas.

--
Problem reports:   http://cygwin.com/problems.html
FAQ:   http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info:  http://cygwin.com/ml/#unsubscribe-simple



Re: Linking shared libraries problem

2010-08-29 Thread Larry Hall (Cygwin)

On 8/29/2010 7:08 PM, Tomás Staig wrote:

Hi,
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.


snip


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.

--
Larry Hall  http://www.rfk.com
RFK Partners, Inc.  (508) 893-9779 - RFK Office
216 Dalton Rd.  (508) 893-9889 - FAX
Holliston, MA 01746

_

A: Yes.

Q: Are you sure?

A: Because it reverses the logical flow of conversation.

Q: Why is top posting annoying in email?


--
Problem reports:   http://cygwin.com/problems.html
FAQ:   http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info:  http://cygwin.com/ml/#unsubscribe-simple