2011-11-03 17 views
5

Mam wspólną bibliotekę, która ma eksportować tylko jedną funkcję oznaczoną __attribute__ ((visibility ("default"))). Łączy ona również z innej biblioteki statycznych (fftw) imingw -fvisibility = ukryty nie działa

#include<fftw3.h> 

jest poprzedzone:

#pragma GCC visibility push(hidden) 

Komenda łącznik używany:

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

Teraz powstały biblioteka jest ogromny i jeśli Sprawdzam wyeksportowane funkcje, które obejmują WSZYSTKIE funkcje fftw oraz WSZYSTKIE funkcje z moich plików. Wygląda na to, że mingw ignoruje opcje widoczności. Czytałem, że wcześniej ostrzegał o -fvisibility, ale teraz kompiluje się bez ostrzeżeń.

Czy mingw i gcc 4.6.1 obsługują flagi widoczności? Jeśli tak, w jaki sposób mogę pozbyć się wszystkich niepotrzebnych rzeczy w mojej wspólnej bibliotece?

Odpowiedz

1

Pliki obiektów Windows PE nie mają atrybutów widoczności. Najbliższy jest dllexport/dllimport, ale jest to tylko dla bibliotek współdzielonych (DLL). Dlatego też nie zaznaczaj wszystkich funkcji FFTW za pomocą __declspec(dllexport) i miej nadzieję, że łączenie biblioteki statycznej ma wartość The Right Thing (tm) lub jeśli nie będziesz łączyć z FFTW, jeśli łączysz się z biblioteką.

Należy ostrzegać przed atrybutami o złej widoczności, być może trzeba zwiększyć poziom ostrzeżenia -Wall -Wextra -pedantic).

4

Mingw to port systemu narzędzi GCC dla systemu Windows, ale system Windows dll nie jest systemem Linux so. Zwłaszcza the link part is different. Aby określić widoczność z MingGW trzeba przejść drogę systemu Windows i opisywanie swoich klas i funkcji z:

  • __declspec(dllexport) podczas kompilacji biblioteki
  • __declspec(dllimport) natomiast powiązanie

Jeśli chcesz wieloplatformowe wsparcie GCC Toolchain możesz dodać nagłówek w swoim projekcie, robiąc to za Ciebie. Przykład krok po kroku i wiele szczegółów have a look at GCC's visibility guide.