RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 925828
Accepted
JamesBondCaesar
JamesBondCaesar
Asked:2020-12-26 23:46:33 +0000 UTC2020-12-26 23:46:33 +0000 UTC 2020-12-26 23:46:33 +0000 UTC

如何从动态库 (*.so) Linux C++ 中正确导出类

  • 772

我正在学习 Linux 编程。想请教一下如何正确注册Linux动态库中的导出类?我正在用 C++ 编写一个测试项目。

有一个测试类标记:

class Book
{
private:
    int m_year;
    std::string m_author;
    std::string m_bookName;

public:

    Book(int year=0, const char* author="Default", const char* bookName="Default"):
        m_year{year},
        m_author{author},
        m_bookName{bookName}
    {
    }

    std::string getStr();

    int getYear();
};

这个类将被移动到动态库中。

告诉我如何正确导出它以便在使用这个库的项目中可用?网上有很多关于导出 C 函数的信息,但我找不到任何关于在 Linux 下导出类的有用信息。

我这样编译:

g++ -shared -o libBook.so -Wall -fPIC Book.h Book.cpp 

找到了一种方法 - 使用属性:

__attribute__((visibility("default")))

它似乎工作。还有其他方法吗?这种方法的准确性如何?或者可以根本不指定任何属性?尽管如此,该程序工作并使用 Book 类。

c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Fat-Zer
    2020-12-27T01:16:10Z2020-12-27T01:16:10Z

    对于初学者,在 linux 上使用 gcc 构建 elf 时,默认情况下所有符号都是可见的,即 简单的组装。

     g++ -shared -o libBook.so -Wall -fPIC Book.h Book.cpp 
    

    Book界面可见(以 MS 形式导出)就足够了。但是当然,为了整洁,最好限制库接口(这就是为什么),

    如何实际隐藏符号

    为了让 gcc 默认隐藏符号,您必须显式地将密钥传递给它-fvisibility=hidden。为了使单个字符可见,您需要使用适当的属性标记它们:

    class __attribute__((visibility("default"))) Book;
    

    或 C++11 风格:

    class [[gnu::visibility("default")]] Book;
    

    同样,您可以显式隐藏符号:

    class __attribute__((visibility("hidden"))) BookInternalImp;
    

    将这些属性应用于声明就足够了。不必指定它们来定义每个函数。但是,例如,您可以隐藏类的单个静态成员和成员函数:

    class [[gnu::visibility("default")]] Book {
    private:
      void [[gnu::visibility("hidden")]] doSomeInternalProcessing();
      static BookManager* [[gnu::visibility("hidden")]] internalManager;
    }
    

    您还可以对一系列连续声明使用具有类似效果的 pragma(但这些 pragma 不会影响单个类成员):

    #pragma GCC visibility push(visibility)
    class Book;
    class Author;
    #pragma GCC visibility pop
    

    属性还有其他值visibility:protected和internal,但是它们没有多大用处,因此通常很少有人记得它们(有关详细信息,请参阅文档)。

    • 8

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5