使用 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++ 构造函数的主要内容,如果未能解决你的问题,请参考以下文章