2011-11-03 141 views
5

我有一個共享庫,它應該只導出一個功能,標記爲__attribute__ ((visibility ("default")))。它也與其他靜態庫(FFTW)相連,並mingw -fvisibility =隱藏似乎並不工作

#include<fftw3.h> 

前面有:

#pragma GCC visibility push(hidden) 

使用的連接命令:

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

現在所產生的庫是巨大的,如果我檢查導出的函數,它包括所有fftw函數和我的文件中的所有函數。看起來mingw忽略了可見性選項。我之前讀到過,它給出了關於-fvisibility的警告,但現在它編譯時沒有任何警告。

mingw和gcc 4.6.1是否支持可見性標誌?如果是的話,我如何擺脫共享庫中所有不必要的東西?

回答

1

Windows PE對象文件沒有可見性屬性。最接近的是dllexport/dllimport,但這隻適用於共享庫(DLL)。因此,要麼不用__declspec(dllexport)標記所有FFTW函數,並且希望鏈接靜態庫The Right Thing (tm),或者如果鏈接到庫,請注意不要鏈接到FFTW。

它應該警告不良的可見性屬性,也許你需要調高警告水平-Wall -Wextra -pedantic)。

4

Mingw是GCC工具鏈的Windows端口,但Windows dll不是Linux so。特別是the link part is different。要指定與MingGW的知名度,你必須去的Windows操作方式,並與註釋類和功能:如果你想爲多平臺支持

  • __declspec(dllexport)在編譯庫
  • __declspec(dllimport)同時連接

GCC工具鏈可以在你的項目中爲你添加一個標題。對於一步一步的例子和大量的細節have a look at GCC's visibility guide