2011-11-03 10 views
5

Ho una libreria condivisa che dovrebbe esportare solo una funzione contrassegnata con __attribute__ ((visibility ("default"))). Si collega anche con un'altra libreria statica (fftw), emingw -fvisibility = hidden non sembra funzionare

#include<fftw3.h> 

è preceduto da:

#pragma GCC visibility push(hidden) 

Il comando linker utilizzato:

g++.exe -fvisibility=hidden -shared -o mylib.dll -Wl,--out-implib,mylib.dll.a -Wl,--no-whole-archive libfftw3.a libfftw3_omp.a -lgomp 

Ora la libreria risultante è enorme e se Controllo le funzioni esportate che include TUTTE le funzioni fftw e TUTTE le funzioni dei miei file. Sembra che mingw ignori le opzioni di visibilità. Ho letto che in precedenza aveva dato un avviso su -fvisibility, ma ora viene compilato senza alcun tipo di avviso.

Mingw e gcc 4.6.1 supportano i flag di visibilità? Se sì, come faccio a eliminare tutte le cose inutili nella mia libreria condivisa?

risposta

1

I file oggetto Windows PE non hanno attributi di visibilità. Il più vicino è dllexport/dllimport, ma è solo per le librerie condivise (DLL). Pertanto, non contrassegnate tutte le funzioni FFTW con __declspec(dllexport) e sperate di collegare la libreria statica allo The Right Thing (tm) oppure fate attenzione a non collegarvi a FFTW se collegate alla vostra libreria.

Dovrebbe avvisare sugli attributi di cattiva visibilità, forse è necessario alzare il livello di avviso -Wall -Wextra -pedantic).

4

Mingw è una porta Windows di GCC toolchain ma Windows dll non è Linux so. Soprattutto the link part is different. Per specificare la visibilità con MingGW si deve andare il modo in cui Windows e annotare le vostre classi e funzioni con:

  • __declspec(dllexport) durante la compilazione della libreria
  • __declspec(dllimport) durante il collegamento

Se si desidera il supporto multipiattaforma per la toolchain GCC è possibile aggiungere un'intestazione nel progetto facendo questo per voi. Per un esempio dettagliato e molti dettagli have a look at GCC's visibility guide.