导出内联声明的类函数

时间:2014-02-11 03:08:17

标签: c++ symbols

如果我有以下文件:

class Foo {
public:
    void bar() { }
};

void baz()
{
}

编译它,并列出目标文件中的符号,我看到没有生成Foo :: bar。

$ clang++ -c Foo.cpp
$ nm -m Foo.o
0000000000000028 (__TEXT,__eh_frame) non-external EH_frame0
0000000000000000 (__TEXT,__text) external __Z3bazv
0000000000000040 (__TEXT,__eh_frame) external __Z3bazv.eh

但是,如果我修改baz()来调用Foo :: bar(),那么生成Foo :: bar()符号(弱):

$ clang++ -c Foo.cpp
$ nm -m Foo.o
0000000000000070 (__TEXT,__eh_frame) non-external EH_frame0
0000000000000000 (__TEXT,__text) external __Z3bazv
0000000000000088 (__TEXT,__eh_frame) external __Z3bazv.eh
0000000000000020 (__TEXT,__textcoal_nt) weak external automatically hidden __ZN3Foo3barEv
00000000000000b0 (__TEXT,__eh_frame) weak external __ZN3Foo3barEv.eh

似乎只有在编译单元中调用内联声明的实例函数的代码才会生成,这似乎是代码生成器/链接器优化。但是,如果我正在创建共享库,我可能无法导出实例函数(因为符号未在任何地方定义)。那真是太可惜了。

显然我可以解决这个问题,并在.cpp文件中定义实例函数。这个问题有更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:2)

您的功能在标题中定义,如果您创建共享库并想要链接它,您还需要标题。

给定标题,然后编译器将内联编译函数,完全按照它的方式编译。

这里没有真正需要解决的问题。