mingw -fvisibility=hidden似乎没有起作用

6

我有一个共享库,它只应该导出一个被标记为__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函数和我文件中的所有函数。看起来mingw忽略了可见性选项。我读到以前它会警告-fvisibility,但现在它编译没有任何警告。
mingw和gcc 4.6.1是否支持可见性标志?如果是,我该如何去掉共享库中所有不必要的东西?
2个回答

4

Mingw是GCC工具链的Windows版本,但Windows dll不同于Linux so。特别是链接部分不同。要使用MingGW指定可见性,您需要按照Windows的方式为您的类和函数注释:

  • __declspec(dllexport)在编译库时
  • __declspec(dllimport)在链接时

如果您想要GCC工具链的多平台支持,可以在项目中添加一个标题来为您完成此操作。有关逐步示例和许多详细信息,请查看GCC的可见性指南


2
Windows PE目标文件没有可见性属性。最接近的是dllexport / dllimport,但这仅适用于共享库(DLL)。因此,您可以选择不使用__declspec(dllexport)标记所有FFTW函数,并希望链接静态库会The Right Thing (tm),或者在链接您的库时不要链接到FFTW。
它应该警告有关错误的可见性属性,也许您需要提高警告级别 -Wall -Wextra -pedantic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接