我是unix / linux世界的新手,并试图查看我编译成共享对象的c ++类的方法和构造函数。
作为测试,我在下面编译为:sudo clang++ -Wall -dynamiclib dynclass.cpp -o dynclass.so
class dynclass {
public:
int x;
int y;
int z;
dynclass () {
}
void emptymethod () { }
};
int foo (void) { return 0; }
然后我使用(查看共享对象中包含的函数/方法):nm dynclass.so
返回:
0000000000000f90 T __Z3foov
U dyld_stub_binder
只有静态功能可见。如何查看emptymethod
和构造函数?
答案 0 :(得分:1)
这是因为构造函数和emptymethod
是在类声明的主体内声明和定义的。在类声明的主体中定义的函数是内联函数(因此不可导出);但这并不意味着它会被内联。
将构造函数的定义移到类声明之外会导致构造函数(和析构函数)列在共享对象的符号表中:
class dynclass {
...
};
dynclass:dynclass() {}
共享对象符号表:
0000000000000712 T _Z3foov
0000000000000708 T _ZN8dynclassC1Ev
0000000000000708 T _ZN8dynclassC2Ev
答案 1 :(得分:0)
我猜您的代码是单个.cpp文件。因此,编译器决定您的库的潜在用户无法访问类dynclass
,并将其隐藏在ELF sympol表中。
有两种方法可以使类可见:
单独声明类和定义(.h和.cpp文件)。 IMO是语义视图中的最佳方式。
或者添加到dynclass
的可见代码引用中:
int foo()
{
dynclass *ptr = new dynclass();
delete ptr;
}`
答案 2 :(得分:0)
这是因为类声明中定义的成员函数是自动inline
d。内联函数的符号(如static
functoin)将不会导出。
我没有从标准中获得这个词,但只是根据我的经验。