2011-11-03 18 views
5

Tengo una biblioteca compartida que se supone que exporta solo una función que está marcada con __attribute__ ((visibility ("default"))). También enlaza con otra biblioteca estática (fftw), ymingw -fvisibility = hidden no parece funcionar

#include<fftw3.h> 

va precedido de:

#pragma GCC visibility push(hidden) 

comando de enlace utilizado:

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

Ahora la biblioteca resultante es enorme y si Compruebo las funciones exportadas, incluye TODAS las funciones de fftw y TODAS las funciones de mis archivos. Parece que mingw ignora las opciones de visibilidad. Leí que anteriormente daba una advertencia sobre -fvisibility, pero ahora compila sin advertencias de ningún tipo.

¿Mingw y gcc 4.6.1 admiten banderas de visibilidad? Si es así, ¿cómo me deshago de todas las cosas innecesarias en mi biblioteca compartida?

Respuesta

1

Los archivos de objetos de Windows PE no tienen atributos de visibilidad. El más cercano es dllexport/dllimport, pero eso es solo para bibliotecas compartidas (DLL). Entonces, o bien no marcas todas las funciones de FFTW con __declspec(dllexport), y esperamos vincular la biblioteca estática al The Right Thing (tm), o tengas cuidado de no vincular a FFTW si estás enlazando con tu biblioteca.

Debe advertir acerca de los atributos de mala visibilidad, quizás deba subir el nivel de advertencia -Wall -Wextra -pedantic).

4

Mingw es un puerto de Windows de la cadena de herramientas de GCC pero Windows dll no es Linux so. Especialmente the link part is different. Para especificar la visibilidad con MingGW que tiene que seguir el camino de Windows y anotar sus clases y funciones con:

  • __declspec(dllexport) durante la compilación de la biblioteca
  • __declspec(dllimport) mientras que une

Si desea soporte multiplataforma para utilizar la cadena de herramientas GCC puede agregar un encabezado en su proyecto que lo haga por usted. Para un ejemplo paso a paso y muchos detalles have a look at GCC's visibility guide.

Cuestiones relacionadas