导出内联声明的类函数
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 道具类型内联,该函数声明使用对象解构来声明道具