【问题标题】:Exporting an inline-declared class function导出内联声明的类函数
【发布时间】:2014-02-11 03:08:17
【问题描述】:

如果我有以下文件:

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 文件中定义实例函数。这个问题有更优雅的解决方案吗?

【问题讨论】:

    标签: c++ symbols


    【解决方案1】:

    您的函数在标头中定义,如果您创建一个共享库并想要链接它,您还需要标头。

    给定头文件,编译器将按照预期的方式内联编译函数。

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

    【讨论】:

      猜你喜欢
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-23
      相关资源
      最近更新 更多