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]

Linking shared libraries problem

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.

int add(int a, int b);

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

int sub(int a, int b);

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

#include <stdio.h>
#include "x.h"
#include "y.h"

int main()
   return 0;

Makfile in Linux:
g++ -c x.cpp
g++ -c y.cpp
g++ -shared -Wl,-whole-archive y.o -Wl,-no-whole-archive -o
g++ -shared -Wl,-whole-archive x.o -Wl,-no-whole-archive -L./ -ly -o
g++ -o main main.cpp -L./ -lx

Makefile in Cygwin:
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
$ ldd =>  (0xb772f000) (0xb7729000) => /usr/lib/ (0xb7635000) => /lib/tls/i686/cmov/ (0xb75f9000) => /lib/ (0xb75ee000) => /lib/tls/i686/cmov/ (0xb749f000)
    /lib/ (0xb7730000)

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

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,

Problem reports:
Unsubscribe info:

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