【问题标题】:mingw -fvisibility=hidden does not seem to workmingw -fvisibility=hidden 似乎不起作用
【发布时间】:2011-11-03 11:54:37
【问题描述】:

我有一个共享库,它应该只导出一个标有__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 是否支持可见性标志?如果是,我该如何清除共享库中所有不必要的内容?

【问题讨论】:

    标签: shared-libraries mingw visibility


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

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

      它应该警告不良可见性属性,也许您需要提高警告级别-Wall -Wextra -pedantic)。

      【讨论】:

        猜你喜欢
        • 2011-04-03
        • 2017-12-13
        • 1970-01-01
        • 1970-01-01
        • 2016-11-29
        • 2016-02-01
        • 2020-09-23
        • 2010-12-05
        • 2011-06-14
        相关资源
        最近更新 更多