我有一个共享库,它只能导出一个标有__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是否支持可见性标志?如果是,我如何摆脱共享库中所有不必要的东西?
答案 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
。)