mingw -fvisibility = hidden似乎不起作用

时间:2011-11-03 11:54:38

标签: shared-libraries mingw visibility

我有一个共享库,它只能导出一个标有__attribute__ ((visibility ("default")))的函数。它还链接到另一个静态库(fftw)和

#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函数,以及我文件中的ALL函数。看起来mingw忽略了可见性选项。我读过之前它曾警告过-fvisibility,但现在它编译时没有任何警告。

mingw和gcc 4.6.1是否支持可见性标志?如果是,我如何摆脱共享库中所有不必要的东西?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

Windows PE对象文件没有可见性属性。最接近的是dllexport / dllimport,但这仅适用于共享库(DLL)。因此,要么不使用__declspec(dllexport)标记所有FFTW函数,并希望链接静态库The Right Thing (tm),要么在链接到库时注意不要链接到FFTW。

它应警告可见性属性不佳,或许您需要调高警告级别-Wall -Wextra -pedantic。)