使用 g++ 中的版本脚本导出 c++ 构造函数

Posted

技术标签:

【中文标题】使用 g++ 中的版本脚本导出 c++ 构造函数【英文标题】:export c++ constructor using version script in g++ 【发布时间】:2019-08-12 06:16:27 【问题描述】:

假设我有这个简单的 C++ 类:

//Myclass.h
class MyClass

    public:

    MyClass(char *cfgFile,int Num);
    void tfuuuuuuu1(double X);
    void tfuuuuuuu2(float X,float Y);

;

我只想导出构造函数 MyClass(char *cfgFile,int Num); 使用 gcc 中的 --version-script 选项(如果重要,则为 7.4.0)所以当我输入时 $ nm -D --defined-only libMyLib.so我只会看到构造函数,怎么办?

【问题讨论】:

【参考方案1】:

第 0 步:使用实际(或至少是正确的)代码。您提供的示例无法编译,因为 class Myclass != MyClass

第 1 步:确定所需构造函数的错位名称:

nm -C libMyLib.so | grep '::MyClass'

000000000000111a T MyClass::MyClass(char*, int)
000000000000111a T MyClass::MyClass(char*, int)

nm  libMyLib.so | grep 111a
000000000000111a T _ZN7MyClassC1EPci
000000000000111a T _ZN7MyClassC2EPci

第 2 步:编写链接描述文件:

cat libMyLib.lds
FOO 
  global: _ZN7MyClassC2EPci;
  local: *;
;

第 3 步:盈利。

附:在构造函数上使用__attribute__((visibility("default"))) 并使用-fvisibility=hidden 构建而不是使用版本脚本可能更容易。

【讨论】:

谢谢,(更正了我的 Q),顺便说一句,-fvisibility 根本不起作用,nm 仍然显示所有功能 - 这就是我使用版本脚本的原因。顺便说一句,你知道为什么转储中有两个构造函数,而不是一个吗?我的代码也看到了同样的情况 @BennyK -fvisibility 确实工作。问一个单独的问题,我会告诉你怎么做。

以上是关于使用 g++ 中的版本脚本导出 c++ 构造函数的主要内容,如果未能解决你的问题,请参考以下文章

c++中的构造函数和析构函数

C++ 错误:'(' 标记之前的预期构造函数、析构函数或类型转换

C++ - 构造函数与析构函数的使用

检查 C++ 编译器隐式生成的代码

一个完整的C++类应该包含什么?

小白学习C++ 教程十二C++面向对象编程中的构造函数和析构函数