我正在学习 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 类。
对于初学者,在 linux 上使用 gcc 构建 elf 时,默认情况下所有符号都是可见的,即 简单的组装。
Book界面可见(以 MS 形式导出)就足够了。但是当然,为了整洁,最好限制库接口(这就是为什么),如何实际隐藏符号
为了让 gcc 默认隐藏符号,您必须显式地将密钥传递给它
-fvisibility=hidden。为了使单个字符可见,您需要使用适当的属性标记它们:或 C++11 风格:
同样,您可以显式隐藏符号:
将这些属性应用于声明就足够了。不必指定它们来定义每个函数。但是,例如,您可以隐藏类的单个静态成员和成员函数:
您还可以对一系列连续声明使用具有类似效果的 pragma(但这些 pragma 不会影响单个类成员):
属性还有其他值
visibility:protected和internal,但是它们没有多大用处,因此通常很少有人记得它们(有关详细信息,请参阅文档)。