Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Gcc隐藏来自包含的静态库的符号的可见性_C++_Gcc_Shared Libraries_Visibility_Linker Flags - Fatal编程技术网

C++ Gcc隐藏来自包含的静态库的符号的可见性

C++ Gcc隐藏来自包含的静态库的符号的可见性,c++,gcc,shared-libraries,visibility,linker-flags,C++,Gcc,Shared Libraries,Visibility,Linker Flags,我有: 一个共享库,比如libShared.so,它包含一个类Bar,方法是intbar::do(intd)const 一个静态库,比如libStatic.a,它包含一个类Foo,方法是intfoo::act(inta)const Bar的代码如下: //Bar.h class __attribute__ ((visibility ("default"))) Bar { private: __attribute__ ((visibility ("hidden"))) int pri

我有:

  • 一个共享库,比如libShared.so,它包含一个类
    Bar
    ,方法是
    intbar::do(intd)const
  • 一个静态库,比如libStatic.a,它包含一个类
    Foo
    ,方法是
    intfoo::act(inta)const
    Bar
    的代码如下:

    //Bar.h
    class __attribute__ ((visibility ("default"))) Bar
    {
      private: 
        __attribute__ ((visibility ("hidden"))) int privateMethod(int x) const;
      public:
        Bar() {}
        int do(int d) const;
    }
    
    //Bar.cpp
    #include "Bar.h"
    #include "Foo.h"
    
    int Bar::do(int d) const {
       Foo foo;
       int result = foo.act(d) + this->privateMethod(d);
       return result;
    }
    
    libShared.so使用标志-fvisibility=hidden编译

    问题如下:我执行Linux命令nm-g-D-C——仅定义了libShared.so,结果是类Foo及其方法在libShared.so之外可见,尽管已经告诉编译器隐藏除标记为“public”之外的所有内容(实际上,nm将它们标记为“T”)

    我怎样才能避免这种情况?我希望libShared.so不要暴露来自其依赖项的符号


    谢谢

    您需要编译libStatic.a并使用标志
    -fvisibility=hidden

    -fvisibility=hidden
    仅影响编译器生成的符号的默认可见性,它不会修改现有符号(如从静态库中获取的符号)的可见性


    幸运的是,链接器确实有一个标志来实现这一点:使用
    -Wl,--exclude libs=ALL
    将全局符号的可见性从静态库更改为“隐藏”,从而防止它们被共享库导出。

    抱歉,但这样做不会阻止libShared.so使用Foo?我回答自己。它起作用了!我想这是因为静态链接不支持符号隐藏,所以隐藏标志只有在静态库中的对象在共享库中使用时才会生效。谢谢!请使用cimments insight修改您的答案,了解如何在静态和动态LIB中隐藏符号。我刚才发现了