导出内联声明的类函数

Posted

技术标签:

【中文标题】导出内联声明的类函数【英文标题】: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 文件中定义实例函数。这个问题有更优雅的解决方案吗?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于导出内联声明的类函数的主要内容,如果未能解决你的问题,请参考以下文章

C++:带有 dllimport/dllexport 的内联函数?

为啥我不能在我的类中内联函数? [复制]

内联函数分析

对函数声明强制执行 TSX 道具类型内联,该函数声明使用对象解构来声明道具

C++ 内联函数:这样声明,这样定义,还是两者兼而有之?为啥?

内联函数